Оновлення
Коли я продовжую отримувати відгуки щодо цього, я вважаю, що доцільно пам'ятати, що ця відповідь становить 4 роки. Інтернет дуже швидко розвивався, тому будь ласка, пам’ятайте про цю відповідь.
У мене був той самий випуск нещодавно і я досліджував цю тему.
Надане рішення називається тривалим опитуванням, і щоб правильно його використовувати, ви повинні бути впевнені, що ваш запит AJAX має "великий" час та завжди робити цей запит після поточних закінчень (тайм-аут, помилка чи успіх).
Довге опитування - клієнт
Тут, щоб код короткий, я буду використовувати 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 ):
У jQuery 1.4.x та нижче, об'єкт XMLHttpRequest буде у недійсному стані, якщо запит вичерпується; доступ до будь-яких членів об'єкта може викинути виняток. Тільки в Firefox 3.0+, запити скриптів та JSONP не можна скасувати затримкою; сценарій буде запущений, навіть якщо він з’явиться після періоду очікування.
Довге опитування - сервер
Це не якоюсь конкретною мовою, але це було б щось подібне:
function handleRequest () {
while (!anythingHappened() || hasTimedOut()) { sleep(2); }
return events();
}
Тут hasTimedOut
переконайтеся, що ваш код не чекає вічно, і anythingHappened
перевірятиме, чи відбудеться якась подія. Це sleep
для того, щоб випустити свою тему, щоб робити інші речі, поки нічого не відбувається. events
Повертає словник подій (або будь-який інший структури даних , ви можете віддати перевагу) в форматі JSON (або будь-який інший ви віддаєте перевагу).
Це, безумовно, вирішує проблему, але, якщо ви стурбовані масштабністю та працездатністю, якою я був при дослідженні, ви можете розглянути інше знайдене нами рішення.
Рішення
Використовуйте розетки!
На стороні клієнта, щоб уникнути будь-яких проблем із сумісністю, використовуйте socket.io . Він намагається використовувати сокет безпосередньо, і мають резервні копії до інших рішень, коли сокети недоступні.
На стороні сервера створіть сервер за допомогою NodeJS (приклад тут ). Клієнт підписується на цей канал (спостерігач), створений із сервером. Щоразу, коли повідомлення повинно бути надіслане, воно публікується на цьому каналі, і підписник (клієнт) отримує повідомлення.
Якщо це рішення вам не подобається, спробуйте APE ( Ajax Push Engine ).
Сподіваюся, я допоміг.