Memperbarui
Ketika saya terus menerima upvotes tentang ini, saya pikir masuk akal untuk mengingat bahwa jawaban ini adalah 4 tahun. Web telah berkembang dengan sangat cepat, jadi harap perhatikan jawaban ini.
Saya memiliki masalah yang sama baru-baru ini dan meneliti tentang masalah ini.
Solusi yang diberikan disebut polling panjang, dan untuk menggunakannya dengan benar, Anda harus yakin bahwa permintaan AJAX Anda memiliki batas waktu "besar" dan untuk selalu membuat permintaan ini setelah akhir saat ini (batas waktu, kesalahan atau kesuksesan).
Polling Panjang - Klien
Di sini, untuk menjaga agar kode tetap pendek, saya akan menggunakan 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);
}
Penting untuk diingat bahwa (dari jQuery docs ):
Di jQuery 1.4.x dan di bawah ini, objek XMLHttpRequest akan berada dalam keadaan tidak valid jika permintaan habis; mengakses objek apa pun yang anggota dapat melemparkan pengecualian. Hanya di Firefox 3.0+, permintaan skrip dan JSONP tidak dapat dibatalkan dengan batas waktu; skrip akan berjalan bahkan jika itu tiba setelah periode waktu habis.
Polling Panjang - Server
Itu tidak dalam bahasa tertentu, tetapi akan menjadi sesuatu seperti ini:
function handleRequest () {
while (!anythingHappened() || hasTimedOut()) { sleep(2); }
return events();
}
Di sini, hasTimedOut
akan memastikan kode Anda tidak menunggu selamanya, dan anythingHappened
, akan memeriksa apakah ada peristiwa yang terjadi. The sleep
adalah untuk melepaskan thread Anda untuk melakukan hal-hal lain sementara tidak ada yang terjadi. The events
akan kembali kamus peristiwa (atau struktur data lainnya Anda dapat memilih) dalam format JSON (atau lainnya yang Anda suka).
Itu pasti memecahkan masalah, tetapi, jika Anda khawatir tentang skalabilitas dan kinerja seperti ketika saya meneliti, Anda mungkin mempertimbangkan solusi lain yang saya temukan.
Larutan
Gunakan soket!
Di sisi klien, untuk menghindari masalah kompatibilitas, gunakan socket.io . Mencoba menggunakan soket secara langsung, dan memiliki solusi fallbacks untuk solusi lain ketika soket tidak tersedia.
Di sisi server, buat server menggunakan NodeJS (contoh di sini ). Klien akan berlangganan saluran ini (pengamat) yang dibuat dengan server. Setiap kali pemberitahuan harus dikirim, itu diterbitkan di saluran ini dan pelanggan (klien) akan diberi tahu.
Jika Anda tidak menyukai solusi ini, coba APE ( Ajax Push Engine ).
Semoga saya bisa membantu.