UPDATE Und weitere zwei Jahre später sieht das verrückt aus, weil sich die akzeptierte Antwort in etwas viel Besseres geändert hat! (Obwohl immer noch nicht so gut wie Yair Leviels Antwort mit jQuery's when)
18 Monate später habe ich gerade etwas Ähnliches getroffen. Ich habe eine Schaltfläche zum Aktualisieren und möchte, dass der alte Inhalt fadeOutund dann der neue Inhalt angezeigt werden fadeIn. Ich brauche aber auch getden neuen Inhalt. Die fadeOutund die getsind asynchron, aber es wäre Zeitverschwendung, sie seriell auszuführen.
Was ich tue, ist wirklich dasselbe wie die akzeptierte Antwort, außer in Form einer wiederverwendbaren Funktion. Seine Haupttugend ist, dass es viel kürzer ist als die anderen Vorschläge hier.
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);
}
});
});
};
Sie übergeben ihm eine Reihe von Funktionen, die parallel ausgeführt werden sollen. Jede Funktion sollte eine andere Funktion akzeptieren, an die sie ihr Ergebnis weitergibt (falls vorhanden). parallelwird diese Funktion liefern.
Sie übergeben ihm auch eine Funktion, die aufgerufen werden soll, wenn alle Vorgänge abgeschlossen sind. Dies erhält ein Array mit allen Ergebnissen in. Mein Beispiel war also:
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();
});
});
Wenn Sie also auf die Schaltfläche "Aktualisieren" klicken, starte ich den fadeOutEffekt von jQuery und meine eigene portlet.contentFunktion (die eine Asynchronisierung ausführt get, ein neues Stück Inhalt erstellt und weiterleitet). Wenn beide abgeschlossen sind, entferne ich den alten Inhalt und füge das Ergebnis hinzu der zweiten Funktion (die in ist results[1]) und fadeIndes neuen Inhalts.
Da fadeOutnichts an seine Vervollständigungsfunktion übergeben wird, results[0]vermutlich enthält undefined, ignoriere ich es. Wenn Sie jedoch drei Operationen mit nützlichen Ergebnissen hätten, würden sie jeweils in resultsderselben Reihenfolge in das Array eingesteckt, in der Sie die Funktionen übergeben haben.