Mettre à jour
Alors que je continue à recevoir des votes positifs à ce sujet, je pense qu'il est raisonnable de se rappeler que cette réponse a 4 ans. Le Web s'est développé à un rythme très rapide, alors soyez attentif à cette réponse.
J'ai eu le même problème récemment et fait des recherches sur le sujet.
La solution proposée est appelée longue interrogation, et pour l'utiliser correctement, vous devez être sûr que votre requête AJAX a un "grand" délai d'attente et toujours faire cette demande après la fin actuelle (délai d'attente, erreur ou succès).
Interrogation longue - Client
Ici, pour garder le code court, j'utiliserai 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 (à partir des documents jQuery ):
Dans jQuery 1.4.x et versions antérieures, l'objet XMLHttpRequest sera dans un état non valide si la demande expire; l'accès à n'importe quel membre d'objet peut lever une exception. Dans Firefox 3.0+ uniquement, les requêtes de script et JSONP ne peuvent pas être annulées par un délai d'expiration; le script s'exécutera même s'il arrive après la période d'expiration.
Interrogation longue - Serveur
Ce n'est pas dans une langue spécifique, mais ce serait quelque chose comme ceci:
function handleRequest () {
while (!anythingHappened() || hasTimedOut()) { sleep(2); }
return events();
}
Ici, hasTimedOut
s'assurera que votre code n'attend pas éternellement et anythingHappened
vérifiera si un événement se produit. C'est sleep
pour libérer votre thread pour faire d'autres choses alors que rien ne se passe. Le events
renvoie 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).
Cela 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 prises!
Côté client, pour éviter tout problème de compatibilité, utilisez socket.io . Il essaie d'utiliser directement le socket et a des solutions de rechange à d'autres solutions lorsque les sockets ne sont pas disponibles.
Côté serveur, créez un serveur à l'aide de NodeJS (exemple ici ). Le client s'abonnera à ce canal (observateur) créé avec le serveur. Chaque fois qu'une notification doit être envoyée, elle est publiée sur ce canal et le souscripteur (client) est notifié.
Si vous n'aimez pas cette solution, essayez APE ( Ajax Push Engine ).
J'espère que j'ai aidé.