Güncelleme
Bu konuda oy almaya devam ederken, bu cevabın 4 yaşında olduğunu hatırlamanın makul olduğunu düşünüyorum. Web gerçekten hızlı bir şekilde büyüdü, bu yüzden lütfen bu cevaba dikkat edin.
Son zamanlarda aynı sorunu yaşadım ve konuyu araştırdım.
Verilen çözüm uzun yoklama olarak adlandırılır ve doğru bir şekilde kullanmak için AJAX isteğinizin "büyük" bir zaman aşımına sahip olduğundan emin olmanız ve bu isteği her zaman geçerli sona erdikten sonra (zaman aşımı, hata veya başarı) yapmanız gerekir.
Uzun Oylama - Müşteri
Burada, kodu kısa tutmak için jQuery kullanacağım:
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);
}
Bunu hatırlamak önemlidir ( jQuery dokümanlarından ):
JQuery 1.4.x ve önceki sürümlerinde, istek zaman aşımına uğradığında XMLHttpRequest nesnesi geçersiz bir durumda olacaktır; herhangi bir nesne üyesine erişim bir istisna oluşturabilir. Yalnızca Firefox 3.0 ve sonraki sürümlerinde, komut dosyası ve JSONP istekleri zaman aşımı ile iptal edilemez; komut dosyası zaman aşımı süresinden sonra gelse bile çalışır.
Uzun Çağırma - Sunucu
Belirli bir dilde değil, ancak şöyle bir şey olurdu:
function handleRequest () {
while (!anythingHappened() || hasTimedOut()) { sleep(2); }
return events();
}
Burada, hasTimedOut
kodunuzun sonsuza kadar beklemediğinden emin olacak ve anythingHappened
herhangi bir olayın olup olmadığını kontrol edecektir. sleep
Hiçbir şey olmuyor iken başka şeyler yapmak için iplik salan içindir. events
JSON biçiminde olayların bir sözlüğü (veya tercih herhangi bir başka veri yapısını) döndürecektir (veya başka tercih).
Sorunu kesinlikle çözer, ancak araştırırken olduğu gibi ölçeklenebilirlik ve performans konusunda endişeleriniz varsa, bulduğum başka bir çözümü düşünebilirsiniz.
Çözüm
Yuva kullanın!
İstemci tarafında, uyumluluk sorunlarından kaçınmak için socket.io kullanın . Soketi doğrudan kullanmaya çalışır ve soketler olmadığında diğer çözümlere geri dönüşler yapar.
Sunucu tarafında, NodeJS kullanarak bir sunucu oluşturun (örnek burada ). İstemci, sunucuyla oluşturulan bu kanala (gözlemci) abone olur. Bir bildirim gönderilmesi gerektiğinde, bu kanalda yayınlanır ve aboneye (istemci) bildirim gönderilir.
Bu çözümü beğenmediyseniz, APE'yi ( Ajax Push Engine ) deneyin .
Umarım yardımcı oldum.