Mise à jour
Comme je continue à recevoir des votes positifs à ce sujet, je pense qu'il est raisonnable de rappeler que cette réponse a 4 ans. Le Web s'est développé à un rythme très rapide, alors soyez attentifs à cette réponse.
J'ai eu le même problème récemment et j'ai fait des recherches sur le sujet.
La solution proposée est appelée "long polling", et pour l'utiliser correctement, vous devez vous assurer que votre requête AJAX dispose d'un "large" timeout et de toujours effectuer cette requête après la fin du courant (timeout, erreur ou succès).
Longs scrutins - Client
Ici, pour garder un code court, je vais utiliser 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);
}
Il est important de se rappeler que (de Documentation sur jQuery ) :
Dans les versions jQuery 1.4.x et inférieures, l'objet XMLHttpRequest se trouve dans un état invalide si la requête expire. état invalide si la requête expire ; l'accès à tout membre de l'objet peut peut entraîner une exception. Dans Firefox 3.0+ uniquement, les demandes script et JSONP ne peuvent pas être annulées par un délai d'attente ; le script s'exécutera même s'il arrive après le délai d'attente. il arrive après le délai d'attente.
Interrogation longue durée - Serveur
Ce n'est pas dans une langue spécifique, mais ce serait quelque chose comme ça :
function handleRequest () {
while (!anythingHappened() || hasTimedOut()) { sleep(2); }
return events();
}
Ici, hasTimedOut
s'assurera que votre code n'attende pas indéfiniment, et anythingHappened
vérifiera si un événement s'est produit. Le site sleep
sert à libérer votre fil pour faire autre chose pendant que rien ne se passe. Le site events
retournera un dictionnaire d'événements (ou toute autre structure de données que vous préférez) au format JSON (ou tout autre que vous préférez).
Elle résout sûrement le problème, mais si vous êtes préoccupé par l'évolutivité et la performance comme je l'étais lors de mes recherches, vous pourriez envisager une autre solution que j'ai trouvée.
Solution
Utilisez des douilles !
Du côté client, pour éviter tout problème de compatibilité, utilisez socket.io . Il essaie d'utiliser directement les sockets, et a des solutions de repli vers d'autres solutions lorsque les sockets ne sont pas disponibles.
Du côté serveur, créez un serveur en utilisant NodeJS (exemple aquí ). Le client s'abonne à ce canal (observateur) créé avec le serveur. Chaque fois qu'une notification doit être envoyée, elle est publiée dans ce canal et le souscripteur (client) est notifié.
Si vous n'aimez pas cette solution, essayez APE ( Moteur de poussée Ajax ).
J'espère avoir aidé.