Domanda

Ho letto alcune delle altre domande correlate ( Pattern per il wrapping di una funzione JavaScript asincrona per renderla sincrona & amp; Rendi sincronizzato l'evento asincrono in JavaScript & amp; potrebbero essercene di più), ma voglio solo essere sicuro di esaurire tutte le possibilità.

Potrebbe essere possibile " convertire " un XmlHttpRequest asincrono in uno quasi sincrono usando setInterval o setTimeout?

L'idea è che in caso di esito positivo della richiesta Ajax verrà impostata una variabile, che sarà il segnale per un ciclo while (che ha chiamato setInterval o setTimeout e una funzione di callback appropriata) per uscire. O sto fondamentalmente fraintendendo le capacità (o le limitazioni?) Di setInterval e / o setTimeout?

È stato utile?

Soluzione

È vero, non vuoi usare setInterval e setTimeout come hai descritto. Quello che vuoi davvero fare è metterti comodo con le funzioni nidificate, dove puoi scrivere in modo più o meno sincrono.

Ad esempio:

XHR.get(your_data, function()
   {
      //what you would have done "synchronously"
   });

Mentre puoi usare setInterval e / o setTimeout (con chiamate per impostare nuovamente TimeTime nel corpo della funzione) per " poll " per un codice di successo, questo approccio è drammaticamente inferiore alla gestione del callback in primo luogo invece di eseguire il polling per esso. Introduce la latenza, scappa con la CPU e non si adatta a più richieste XHR, per citarne alcune carenze.

XHR chiamerà la tua funzione una volta completata, ha poco senso eseguire una funzione chiedendo " Abbiamo ancora finito? Abbiamo già finito? & Quot; nel frattempo. D'altra parte, se si verifica un comportamento periodico che si desidera BLOCCARE fino a quando non viene restituita la risposta (un pezzo di animazione che richiede l'esecuzione di tali dati, ad esempio) è del tutto accettabile circondare il codice di blocco in un'istruzione if:

var tick = window.setTimeout(tock, 20);
var tock = function()
{
   if (response_done)
   {
      // dependent code
   }
   tick = window.setTimeout(tock, 20);
}
XHR.get(your_data, function() { /*Handle response*/ response_done = true; });

Altri suggerimenti

Se sto rispondendo correttamente alla tua domanda, potresti ottenere un effetto simile utilizzando il seguente codice:

var computationInterval =
    window.setInterval(function() {
        // do a computation cycle, as if you're in the body of a while loop
    }, 100);

$.get('http://example.com/areWeThereYet', function() {
    // break the intervals (the pseudo-cycle)
    window.clearInterval(computationInterval);
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top