2009-10-09 11 views
10

Ho una semplice funzione Javascript:funzione di Forza Javascript chiamata ad aspettare fino a quando quello precedente è finito

makeRequest(); 

Si fa un mucchio di roba e pone una serie di contenuti nel DOM.

faccio un paio di telefonate in questo modo:

makeRequest('food'); 
makeRequest('shopping'); 

Tuttavia, entrambi fuoco così rapidamente che si stanno intensificando in piedi a vicenda. In definitiva ho bisogno di avere la funzionalità di.

makeRequest('food'); 
wait.... 
makeRequest('shopping'); only if makeRequest('food') has finished 

Pensieri su come eseguirli solo uno alla volta?

Grazie!

+2

Eseguono solo uno alla volta. Deve esserci qualcosa dentro quelle funzioni che sta eseguendo in modo asincrono - una richiesta AJAX, forse? – Kylotan

+1

Sì, hai ragione. C'è qualcosa che posso fare? – mwilliams

risposta

15

Se queste funzioni eseguono effettivamente una richiesta AJAX, è meglio mantenerle asincrone. È possibile effettuare una richiesta AJAX sincrona, ma impedirà al browser di rispondere e portare a un'esperienza utente negativa.

Se ciò che si richiede se queste richieste AJAX vengono eseguite una dopo l'altra perché dipendono l'una dall'altra, è necessario esaminare la propria funzione per verificare se fornisce un meccanismo di callback.

makeRequest('food', function() 
{ 
    // called when food request is done 
    makeRequest('shopping'); 
}); 

utilizzando jQuery, sembra qualcosa di simile

$.get("/food", function(food) 
{ 
    // do something with food 

    $.get("/shopping", function(shopping) 
    { 
     // do something with shopping 
    }); 
}); 
+0

+1 Questa è la strada da percorrere. – ChaosPandion

+0

Avvicinarsi. Ho provato il tuo primo esempio e makeRequest con lo shopping non viene chiamato. Posso lanciare un avviso e non viene attivato neanche – mwilliams

+0

Ciò significa che hai fatto qualcosa di sbagliato. Perché non pubblichi quello che hai fatto? – ChaosPandion

1

mi sento di raccomandare che semplicemente scrivere loro in modo asincrono - per esempio, chiamare makeRequest ('shopping'); dal gestore di completamento AJAX della prima chiamata.

Se non si vuole scrivere il codice in modo asincrono, vedere Javascript Strands

1

Suppongo che si dispone di un metodo di callback che si prende cura della risposta per la richiesta? Fatto ciò, fai la prossima richiesta.

Dichiarare una matrice per la coda, e una bandiera per tenere traccia dello stato:

var queue = [], requestRunning = false; 

Nel metodo makeRequest:

if (requestRunning) { 
    queue.push(requestParameter); 
} else { 
    requestRunning = true; 
    // do the request 
} 

Nel metodo di callback, dopo aver preso cura della risposta:

if (queue.length > 0) { 
    var requestParameter = queue.splice(0,1)[0]; 
    // do the request 
} else { 
    requestRunning = false; 
} 
+0

Molto buono, questo è quello che mi serviva.Potrebbe essere combinato con il metodo qui: http://answers.yahoo.com/question/index?qid=20120102010000AA1olc1 – alexk

0

Se è necessario eseguire una serie di richieste in sequenza, vedere Peter Baker's answer a una mia domanda simile.

Problemi correlati