E altri due anni dopo, questo sembra assurdo perché la risposta accettata è cambiata in qualcosa di molto meglio! (Anche se non è ancora buono come la risposta di Yair Leviel usando jQuery's when
)
18 mesi dopo, ho appena colpito qualcosa di simile. Ho un pulsante di aggiornamento, e voglio il vecchio contenuto a fadeOut
e poi il nuovo contenuto a fadeIn
. Ma ho anche bisogno di get
il nuovo contenuto. fadeOut
e get
sono asincroni, ma sarebbe inutile eseguirli in serie.
Quello che faccio è in realtà la stessa della risposta accettata, tranne che sotto forma di funzione riutilizzabile. La sua virtù principale è che è molto più breve rispetto agli altri suggerimenti qui.
var parallel = function(actions, finished) {
finishedCount = 0;
var results = [];
$.each(actions, function(i, action) {
action(function(result) {
results[i] = result;
finishedCount++;
if (finishedCount == actions.length) {
finished(results);
}
});
});
};
Si passa a una serie di funzioni da eseguire in parallelo. Ogni funzione dovrebbe accettare un'altra funzione a cui passa il suo risultato (se presente). parallel
fornirà quella funzione.
Si passa anche a una funzione da chiamare quando tutte le operazioni sono state completate. Questa riceverà un array con tutti i risultati in Quindi il mio esempio era:.
refreshButton.click(function() {
parallel([
function(f) {
contentDiv.fadeOut(f);
},
function(f) {
portlet.content(f);
},
],
function(results) {
contentDiv.children().remove();
contentDiv.append(results[1]);
contentDiv.fadeIn();
});
});
Così, quando il mio pulsante di aggiornamento viene cliccato, mi lancio effetto fadeOut
di jQuery e anche la mia propria funzione portlet.content
(che fa un asincrono get
, costruisce un nuovo bit di contenuto e lo passa), quindi quando entrambi sono completi rimuovo il vecchio contenuto, aggiungo il risultato della seconda funzione (che è in results[1]
) e il fadeIn
il nuovo contenuto.
Come fadeOut
non passa nulla alla sua funzione di completamento, results[0]
presumibilmente contiene undefined
, quindi lo ignoro. Ma se avessi avuto tre operazioni con risultati utili, avrebbero inserito ciascuna fessura nell'array results
, nello stesso ordine in cui hai passato le funzioni.
Se non sbaglio, tu sei l'autore di "jQuery In Action"? – karim79
Sì! Stiamo lavorando alla seconda edizione mentre parliamo :) –
Great book! Il tuo nome mi ha fatto suonare degli allarmi nella testa! – karim79