Aktualisieren
Da ich weiterhin positive Stimmen dazu erhalte, halte ich es für vernünftig, mich daran zu erinnern, dass diese Antwort 4 Jahre alt ist. Das Web ist sehr schnell gewachsen. Bitte beachten Sie diese Antwort.
Ich hatte kürzlich das gleiche Problem und recherchierte über das Thema.
Die angegebene Lösung wird als langes Polling bezeichnet. Um sie korrekt zu verwenden, müssen Sie sicherstellen, dass Ihre AJAX-Anforderung ein "großes" Zeitlimit aufweist, und diese Anforderung immer nach dem Ende des aktuellen Zeitraums (Zeitlimit, Fehler oder Erfolg) stellen.
Lange Umfrage - Client
Um den Code kurz zu halten, verwende ich hier 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);
}
Es ist wichtig, sich daran zu erinnern (aus jQuery-Dokumenten ):
In jQuery 1.4.x und darunter befindet sich das XMLHttpRequest-Objekt in einem ungültigen Zustand, wenn die Anforderung abgelaufen ist. Der Zugriff auf Objektmitglieder kann eine Ausnahme auslösen. Nur in Firefox 3.0+ können Skript- und JSONP-Anforderungen nicht durch eine Zeitüberschreitung abgebrochen werden. Das Skript wird auch dann ausgeführt, wenn es nach Ablauf der Zeitspanne eintrifft.
Lange Abfrage - Server
Es ist nicht in einer bestimmten Sprache, aber es wäre ungefähr so:
function handleRequest () {
while (!anythingHappened() || hasTimedOut()) { sleep(2); }
return events();
}
Hier hasTimedOut
wird sicherstellen , dass Ihr Code nicht ewig warten, und anythingHappened
wird prüfen , ob jeder Fall geschieht. Das sleep
ist für die Freigabe Ihres Threads, um andere Dinge zu tun, während nichts passiert. Das events
gibt ein Wörterbuch mit Ereignissen (oder einer anderen von Ihnen bevorzugten Datenstruktur) im JSON-Format (oder einer anderen von Ihnen bevorzugten) zurück.
Es löst sicherlich das Problem, aber wenn Sie sich Sorgen über Skalierbarkeit und Leistung machen, wie ich es bei der Recherche war, könnten Sie eine andere Lösung in Betracht ziehen, die ich gefunden habe.
Lösung
Verwenden Sie Steckdosen!
Verwenden Sie auf der Clientseite socket.io , um Kompatibilitätsprobleme zu vermeiden . Es wird versucht, Sockets direkt zu verwenden und auf andere Lösungen zurückzugreifen, wenn keine Sockets verfügbar sind.
Erstellen Sie auf der Serverseite einen Server mit NodeJS (Beispiel hier ). Der Client abonniert diesen mit dem Server erstellten Kanal (Beobachter). Wann immer eine Benachrichtigung gesendet werden muss, wird sie in diesem Kanal veröffentlicht und der Abonnent (Client) wird benachrichtigt.
Wenn Ihnen diese Lösung nicht gefällt, versuchen Sie es mit APE ( Ajax Push Engine ).
Hoffe ich habe geholfen.