ปรับปรุง
ในขณะที่ฉันยังคงได้รับคะแนนโหวตนี้ต่อไปฉันคิดว่ามันสมเหตุสมผลที่จะจำไว้ว่าคำตอบนี้มีอายุ 4 ปี เว็บเติบโตอย่างรวดเร็วดังนั้นโปรดระวังคำตอบนี้
ฉันมีปัญหาเดียวกันเมื่อเร็ว ๆ นี้และค้นคว้าเกี่ยวกับเรื่องนี้
การแก้ปัญหาที่ให้เรียกว่าการทำโพลแบบยาวและการใช้อย่างถูกต้องคุณต้องแน่ใจว่าคำขอ AJAX ของคุณมีการหมดเวลา "ใหญ่" และจะต้องทำคำขอนี้เสมอหลังจากการสิ้นสุดปัจจุบัน (หมดเวลาข้อผิดพลาดหรือความสำเร็จ)
Long Polling - ไคลเอนต์
ที่นี่เพื่อให้รหัสสั้น ๆ ฉันจะใช้ jQuery:
function pollTask() {
$.ajax({
url: '/api/Polling',
async: true, // by default, it's async, but...
dataType: 'json', // or the dataType you are working with
timeout: 10000, // IMPORTANT! this is a 10 seconds timeout
cache: false
}).done(function (eventList) {
// Handle your data here
var data;
for (var eventName in eventList) {
data = eventList[eventName];
dispatcher.handle(eventName, data); // handle the `eventName` with `data`
}
}).always(pollTask);
}
เป็นสิ่งสำคัญที่ต้องจำไว้ว่า (จากjQuery docs ):
ใน jQuery 1.4.x และต่ำกว่าวัตถุ XMLHttpRequest จะอยู่ในสถานะที่ไม่ถูกต้องหากคำขอหมดเวลา การเข้าถึงสมาชิกวัตถุอาจทำให้เกิดข้อยกเว้น ใน Firefox 3.0+ เท่านั้นคำขอสคริปต์และ JSONP ไม่สามารถยกเลิกได้โดยการหมดเวลา สคริปต์จะทำงานแม้ว่าจะมาถึงหลังจากหมดเวลา
Long Polling - เซิร์ฟเวอร์
มันไม่ได้เป็นภาษาเฉพาะ แต่จะเป็นเช่นนี้:
function handleRequest () {
while (!anythingHappened() || hasTimedOut()) { sleep(2); }
return events();
}
ที่นี่hasTimedOut
จะทำให้แน่ใจว่ารหัสของคุณจะไม่รอตลอดไปและanythingHappened
จะตรวจสอบว่ามีเหตุการณ์ใด ๆ เกิดขึ้นหรือไม่ sleep
สำหรับการปล่อยหัวข้อของคุณที่จะทำสิ่งอื่น ๆ ในขณะที่ไม่มีอะไรเกิดขึ้น events
จะกลับมาในพจนานุกรมของเหตุการณ์ที่เกิดขึ้น (หรือโครงสร้างข้อมูลอื่น ๆ ที่คุณอาจจะชอบ) ในรูปแบบ JSON (หรืออื่น ๆ ที่คุณต้องการ)
แน่นอนว่ามันจะแก้ปัญหาได้ แต่ถ้าคุณกังวลเกี่ยวกับความสามารถในการปรับขนาดและความสมบูรณ์แบบเช่นเดียวกับเมื่อทำการวิจัยคุณอาจพิจารณาวิธีแก้ไขปัญหาอื่นที่ฉันพบ
สารละลาย
ใช้ซ็อกเก็ต!
บนฝั่งไคลเอ็นต์เพื่อหลีกเลี่ยงปัญหาใด ๆ ที่เข้ากันได้ใช้socket.io มันพยายามที่จะใช้ซ็อกเก็ตโดยตรงและมีทางเลือกในการแก้ปัญหาอื่น ๆ เมื่อซ็อกเก็ตไม่สามารถใช้ได้
ทางฝั่งเซิร์ฟเวอร์สร้างเซิร์ฟเวอร์โดยใช้ NodeJS (ตัวอย่างที่นี่ ) ลูกค้าจะติดตามช่องนี้ (ผู้สังเกตการณ์) ที่สร้างด้วยเซิร์ฟเวอร์ เมื่อใดก็ตามที่จะต้องส่งการแจ้งเตือนจะมีการเผยแพร่ในช่องนี้และผู้แจ้งเตือน (ลูกค้า) จะได้รับแจ้ง
หากคุณไม่ชอบวิธีนี้ให้ลองใช้ APE ( Ajax Push Engine )
หวังว่าฉันช่วย