L'interrogation AJAX d'une URL renvoyant JSON ne semble pas renvoyer de nouvelles réponses (à l'aide de la méthode jQuery $ .ajax ())

StackOverflow https://stackoverflow.com/questions/1412901

Question

Mon projet nécessite d'interroger une certaine URL pour obtenir une réponse JSON, à l'aide d'AJAX. La première demande AJAX que je fais informe le serveur que je veux du contenu JSON, et il commence à créer et à mettre en cache une réponse, me renvoyant ainsi {"état". : " en attente " } pour chaque requête AJAX suivante jusqu'à ce que le JSON soit prêt. À ce stade, la réponse passe en JSON qui contient un contenu que je peux analyser et afficher dans le document, ce que je souhaite effectuer dès que l'URL renvoie un élément autre que {" status " : " en attente " } .

J'ai mis en place une fonction d'interrogation qui fonctionne comme prévu pour demander de manière répétée JSON à l'URL. Cependant, le problème est qu’il continue de recevoir la réponse {" status " : " en attente " } même lorsque je navigue directement vers l'URL et que je peux voir que la réponse JSON complète est prête et en cours de traitement. Pour une raison quelconque, ma fonction d'interrogation obtient toujours {" status " : " en attente " } .

Lorsque j'actualise la page contenant le code d'interrogation, celle-ci fonctionne généralement à la première demande, c'est-à-dire qu'elle obtient la réponse JSON complète. Cela me porte à croire que c'est une sorte de problème de mise en cache, mais je ne sais pas où et pourquoi. Chaque requête AJAX ne devrait-elle pas recevoir une nouvelle réponse, ou est-ce quelque chose que je peux configurer dans mon appel $. Ajax () ?

Voici le code que j'utilise maintenant:

function ajax_poll() {
  $.ajax({
    url: JSON_URL, // JSON_URL is a string containing the URL to poll
    dataType: 'json',
    error: function(xhr_data) {
      display_error();
    },
    success: function(xhr_data) {
      if (xhr_data.status == 'pending') {
        poll++; // increment poll counter // poll is a global variable to track the number of requests made
        if (poll < POLLS) { // POLLS is a global variable to set the maximum number of requests
          setTimeout(function() { ajax_poll(); }, INTERVAL); // wait INTERVAL before another AJAX request
        } else {
          display_error();
        }
      } else {
        success(xhr_data);
      }
    },
    contentType: 'application/json'
  });
}

success () est la fonction qui affiche le contenu JSON (c'est-à-dire ce que j'attends pour pouvoir être disponible lors de l'interrogation) sur la page.

Une chose à noter est que, tout en testant le code localement, en interrogeant un fichier de test .json local, je peux modifier le contenu du fichier à partir de {" status " : " en attente " } dans une réponse contenant un contenu similaire à celui recherché, enregistrez le fichier entre les instances d'interrogation et, lors de l'interrogation suivante, mon code voit le nouveau contenu et fonctionne comme prévu. Cela ne fonctionne tout simplement pas dans l'environnement de transfert.

Était-ce utile?

La solution

Vous pouvez essayer d'ajouter le " cache: false " option .

Autres conseils

Juste pour décrire une raison potentielle à l'origine de cette situation: vous émettez probablement des requêtes GET AJAX, mais vous ne différenciez pas l'URL de quelque manière que ce soit (aucune donnée supplémentaire dans la chaîne de requête, par exemple).

Le navigateur voit cette demande et ne se donne même pas la peine de frapper le serveur avec la demande complète (il émet probablement des demandes conditionnelles 304 GET). Le résultat final de tout cela est que vous ne voyez pas l'activité que vous attendez de voir.

Un moyen simple de résoudre ce problème est de ne pas mettre en cache les résultats de la demande AJAX ni d’envoyer une demande POST. Affecter les options de cache est couvert dans les autres articles. Le problème avec l’approche POST est que vous ne sauvegardez rien grâce à vos actions, vous exprimez donc mieux vos intentions avec une demande GET.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top