simulando un XmlHttpRequest sincrono
-
05-07-2019 - |
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?
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);
});