Est-il possible de lire une demande AJAX avant que la réponse ne soit terminée?

J'ai une requête ajax qui prend un certain temps, mais le serveur produit du contenu en cours de route. Si je charge la requête simplement dans le navigateur, je peux voir la page en cours de chargement et elle peut être arrêtée à tout moment. Est-il possible d'accéder à une requête ajax incomplète avant que le serveur ne ferme la réponse?

6 Solutions collect form web for “Est-il possible de lire une demande AJAX avant que la réponse ne soit terminée?”

La façon d'y parvenir est d'écouter le readyState dans l'objet xhr. Lorsque readyState == 3, cela signifie qu'un nouveau contenu est arrivé et que vous pouvez y accéder. La technique est appelée Comet.

Notez cependant que différents navigateurs se comportent différemment ici, IE ne vous permettra pas d'y accéder. Voir ici et les navigateurs web (Chrome / Safari) 2KB de données avant de le rendre disponible. Après avoir compté cela, vous pouvez alors écouter le changement puis agir dessus.

Malheureusement, jQuery ne supporte actuellement pas ce problème. Vous pouvez contourner cela comme indiqué dans le bogue n ° 8327 , où ils se replient essentiellement sur l'état de préparation pour voir si cela change. Ils ont l'intention de faire quelque chose à l'avenir, Bug n ° 9883 , mais ne prenez pas votre souffle.

Alors enfin, oui, c'est possible, non, ce n'est pas facile.

Il y a déjà de bonnes réponses, mais aucun d'entre eux n'est vraiment 100% fiable ou multi-navigateur. Une approche plus sûre serait sans doute de ramener votre réponse dans les «pages». Chaque demande peut spécifier quelque chose d'équivalent à LIMIT et OFFSET et vous continuez à faire des demandes jusqu'à obtenir une réponse vide. Cela entraîne des frais généraux supplémentaires sur le client et le serveur, mais ce serait plus robuste.

Tiré de: https://stackoverflow.com/questions/287286/jquery-is-req-readystate- 3-possible

Affectez votre appel ajax à une variable et joignez un événement à son état de readystatechanged .

 var xhr = $.ajax(...); xhr._onreadystatechange = xhr.onreadystatechange; xhr.onreadystatechange = function() { xhr._onreadystatechange(); if (xhr.readyState == 3) alert('Interactive'); }; 

Je ne sais pas avec certitude si cela va fonctionner, mais ça vaut le coup d'essayer:

 $.ajax({ statusCode: { 206: function() { // 206 is partial content // do work } } }); 

Pouvez-vous utiliser un sondage long (comète) au lieu d'ajax? Ensuite, vous pouvez libérer les tampons de sortie et lire le contenu lorsque la demande est en cours de traitement.

http://www.zeitoun.net/articles/comet_and_php/start

La Comète est une bonne solution de rechange en ce moment, mais elle sera remplacée par WebSockets dans un proche avenir.

Bien sûr, les WebSockets ne sont pas compatibles avec de nombreux navigateurs Web courants, mais il existe déjà un certain nombre de polyfills qui imitent les fonctionnalités des navigateurs sourds, dont beaucoup dépendent de Comet (sondage XHR long ) Sous le capot pour imiter les fonctionnalités.


Personnellement, je préfère le polyfill socket.io , mais mon expérience avec celui-ci est limitée à utiliser aux côtés de node.js, qui peut ou non correspondre à ce que vous travaillez.

  • Comment désérialiser correctement une chaîne JSON dans la classe qui contient une liste imbriquée d'une autre classe
  • Comment puis-je remplacer dynamiquement les éléments html avec JSON Data avec Javascript jQuery?
  • Magento escape string pour javascript
  • BackboneJS Make ID Enterger
  • Objet XML to JavaScript
  • JSF + JSON: produit le texte "simple" dans servlet?
  • Json_decode fonctionne sur localhost mais pas sur le serveur web
  • Pourquoi s'appelle BSON?
  • JavaScript rend le site Web intelligent, beaut√© et facile √† utiliser.