Il polling AJAX di un URL che restituisce JSON non sembra restituire nuove risposte (usando il metodo jQuery $ .ajax ())

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

Domanda

Il mio progetto richiede il polling di un determinato URL per una risposta JSON, utilizzando AJAX. La prima richiesta AJAX che invio avvisa il server che desidero del contenuto JSON e inizia a creare e memorizzare nella cache una risposta, restituendomi {" status " : "in sospeso" } per ogni successiva richiesta AJAX fino a quando JSON non è pronto. A quel punto, la risposta cambia in JSON che contiene contenuti che posso analizzare e visualizzare nel documento, cosa che voglio fare non appena l'URL restituisce qualcosa di diverso da {" status " : "in sospeso" } .

Ho impostato una funzione di polling che funziona come previsto per richiedere ripetutamente JSON dall'URL. Tuttavia, il problema è che continua a ottenere la risposta {" status " : "in sospeso" } anche quando navigo direttamente verso l'URL e vedo che la risposta JSON completa è pronta e viene pubblicata. Per qualche motivo, la mia funzione di polling ottiene ancora {" status " : "in sospeso" } .

Quando aggiorno la pagina che contiene il codice di polling, in genere funziona sulla prima richiesta, ovvero ottiene la risposta JSON completa. Questo mi porta a credere che si tratti di una sorta di problema di memorizzazione nella cache, ma non sono sicuro di dove o perché. Ogni richiesta AJAX non dovrebbe ricevere una nuova risposta, o è qualcosa che posso impostare nella mia chiamata $ .ajax () ?

Ecco il codice che sto usando ora:

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 () è la funzione che visualizza il contenuto JSON (ovvero ciò che sto aspettando per diventare disponibile durante il polling) sulla pagina.

Una cosa degna di nota è che mentre collaudo il codice localmente, eseguendo il polling di un file di test .json locale, posso cambiare il contenuto del file da {" status " : "in sospeso" } a una risposta contenente contenuti come quello che sto cercando, salva il file tra istanze di polling e al prossimo sondaggio il mio codice vede il nuovo contenuto e funziona come previsto. Semplicemente non funziona nell'ambiente di gestione temporanea.

È stato utile?

Soluzione

Puoi provare ad aggiungere la " cache: false " opzione .

Altri suggerimenti

Solo per descrivere un potenziale motivo per cui ciò sta accadendo: probabilmente stai inviando richieste GET AJAX, ma non stai differenziando l'URL in alcun modo (ad esempio, nessun dato aggiuntivo nella stringa di query).

Il browser vede questa richiesta e non si preoccupa nemmeno di colpire il server con la richiesta completa (probabilmente emette invece richieste GET 304). Il risultato finale di tutto ciò è che non vedi l'attività che ti aspetti di vedere.

Un modo semplice per risolvere questo problema è non memorizzare nella cache i risultati della richiesta AJAX o inviare una richiesta POST. Le opzioni relative alla cache sono descritte negli altri post. Il problema con l'approccio POST è che non stai salvando nulla con le tue azioni, e quindi stai esprimendo meglio le tue intenzioni con una richiesta GET.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top