In jQuery ist es möglich, einen Rückruf aufzurufen oder ein Ereignis auszulösen, nachdem ein Aufruf von .each()
(oder einer anderen Art von iterativem Rückruf) abgeschlossen wurde .
Zum Beispiel möchte ich, dass dieses "Ausblenden und Entfernen" abgeschlossen wird
$(parentSelect).nextAll().fadeOut(200, function() {
$(this).remove();
});
bevor Sie einige Berechnungen durchführen und neue Elemente nach dem einfügen $(parentSelect)
. Meine Berechnungen sind falsch, wenn die vorhandenen Elemente für jQuery noch sichtbar sind und das Schlafen / Verzögern einer beliebigen Zeitspanne (200 für jedes Element) bestenfalls als spröde Lösung erscheint.
Ich kann leicht .bind()
die notwendige Logik zu einem Ereignisse Rückruf , aber ich bin nicht sicher , wie invoke die sauber .trigger()
nach dem obigen Iteration abgeschlossen . Offensichtlich kann ich den Trigger innerhalb der Iteration nicht aufrufen, da er mehrmals ausgelöst würde.
Im Fall von $.each()
habe ich darüber nachgedacht, am Ende des Datenarguments etwas hinzuzufügen (nach dem ich im Iterationskörper manuell gesucht habe), aber ich würde es hassen, dazu gezwungen zu werden, also hoffte ich, dass es noch etwas anderes Elegantes gibt Möglichkeit, den Fluss in Bezug auf iterative Rückrufe zu steuern.
Antworten:
Eine Alternative zur Antwort von @ tv:
Beachten Sie, dass
.each()
selbst synchron ist - die Anweisung, die auf den Aufruf von folgt,.each()
wird erst ausgeführt, nachdem der.each()
Aufruf abgeschlossen ist. Asynchrone Operationen, die in der.each()
Iteration gestartet wurden, werden natürlich auf ihre eigene Weise fortgesetzt. Das ist hier das Problem: Die Aufrufe zum Ausblenden der Elemente sind zeitgesteuerte Animationen, und diese werden in ihrem eigenen Tempo fortgesetzt.Die obige Lösung verfolgt daher, wie viele Elemente ausgeblendet werden. Jeder Anruf
.fadeOut()
erhält einen Abschlussrückruf. Wenn der Rückruf feststellt, dass er durch alle beteiligten Originalelemente gezählt wird, können einige nachfolgende Maßnahmen mit der Gewissheit ausgeführt werden, dass das gesamte Ausbleichen abgeschlossen ist.Dies ist eine vier Jahre alte Antwort (zu diesem Zeitpunkt im Jahr 2014). Ein moderner Weg, dies zu tun, würde wahrscheinlich die Verwendung des Mechanismus "Zurückgestellt / Versprechen" beinhalten, obwohl das oben Genannte einfach ist und gut funktionieren sollte.
quelle
Es ist wahrscheinlich zu spät, aber ich denke, dieser Code funktioniert ...
quelle
Ok, das könnte etwas später sein, aber .promise () sollte auch das erreichen, wonach Sie suchen.
Versprechen Dokumentation
Ein Beispiel aus einem Projekt, an dem ich arbeite:
:) :)
quelle
JavaScript wird synchron ausgeführt, sodass alles, was Sie danach platzieren
each()
, erst ausgeführt wird, wenneach()
es abgeschlossen ist.Betrachten Sie den folgenden Test:
Wenn die Warnung aufgerufen wird, entspricht die Anzahl 1000000, da die Warnung erst ausgeführt wird, wenn sie abgeschlossen
each()
ist.quelle
each
und jede Animation separat planen, müssen Sie das Ereignis nach der Animation noch auslösen, nicht nach Abschluss der Animation.each()
Problem ist. Deshalb habe ich diese Antwort in die Mischung geworfen.each
nicht garantiert vorher aufgerufen wurdenalert
. Könnten Sie mir die Lesung dazu erklären oder darauf hinweisen?Ich habe viele Antworten gefunden, die sich mit Arrays befassen, aber nicht mit einem JSON-Objekt. Meine Lösung bestand einfach darin, das Objekt einmal zu durchlaufen, während ein Zähler inkrementiert wurde. Wenn Sie dann das Objekt durchlaufen, um Ihren Code auszuführen, können Sie einen zweiten Zähler inkrementieren. Dann vergleichen Sie einfach die beiden Zähler miteinander und erhalten Ihre Lösung. Ich weiß, dass es etwas klobig ist, aber ich habe bisher keine elegantere Lösung gefunden. Dies ist mein Beispielcode:
Wie gesagt, es ist nicht das eleganteste, aber es funktioniert und es funktioniert gut und ich habe noch keine bessere Lösung gefunden.
Prost, JP
quelle
Wenn Sie bereit sind, ein paar Schritte zu machen, könnte dies funktionieren. Es hängt jedoch davon ab, ob die Animationen in der richtigen Reihenfolge beendet werden. Ich denke nicht, dass das ein Problem sein sollte.
quelle
wie wäre es mit
quelle
Sie müssen den Rest Ihrer Anfrage in die Warteschlange stellen, damit sie funktioniert.
quelle
Ich treffe das gleiche Problem und habe es mit einer Lösung wie dem folgenden Code gelöst:
Die Lösung löst das folgende Problem: Synchronisieren der in der .each () - Iteration gestarteten asynchronen Operationen mithilfe des Objekts "Zurückgestellt".
quelle
Möglicherweise eine späte Antwort, aber es gibt ein Paket, das diese https://github.com/ACFBentveld/Await behandelt
quelle
Ich benutze so etwas:
quelle