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?

  • $ Http.get (...) .success n'est pas une fonction
  • Chargement du fichier JSON local
  • Envoi des dates JSON à Google Maps API de Perl
  • JQuery.getJSON peut-il mettre les cookies d'un domaine dans l'en-tête de la demande qu'il fait?
  • Chargement d'un JSON externe dans ChartJs
  • Bouclez la liste d'objets JSON
  • JQuery looping .each () La clé / valeur JSON ne fonctionne pas
  • Comment faire des requêtes Ajax toutes les 10 secondes (en plus de l'interrogation prolongée)?
  • 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.

    JavaScript rend le site Web intelligent, beauté et facile à utiliser.