W jQuery, jest to możliwe do wywołania zwrotnego lub wyzwolić zdarzenie po wystąpieniu pw .each()
(lub innego rodzaju iteracyjnej zwrotnego) jest wypełniony .
Na przykład chciałbym, aby to „znikanie i usuwanie” zakończyło się
$(parentSelect).nextAll().fadeOut(200, function() {
$(this).remove();
});
przed wykonaniem obliczeń i wstawieniem nowych elementów po $(parentSelect)
. Moje obliczenia są niepoprawne, jeśli istniejące elementy są nadal widoczne dla jQuery, a uśpienie / opóźnienie dowolnej ilości czasu (200 dla każdego elementu) wydaje się najlepszym rozwiązaniem kruchym.
Mogę łatwo .bind()
niezbędne do zwrotnego logika zdarzeń, ale nie jestem pewien, jak czysto Wywołuje .trigger()
po wyżej iteracji została zakończona . Oczywiście nie mogę wywołać wyzwalacza wewnątrz iteracji, ponieważ byłby uruchamiany wiele razy.
W przypadku $.each()
rozważałem dodanie czegoś na końcu argumentu danych (którego ręcznie szukałem w treści iteracji), ale nie chciałbym być do tego zmuszony, więc miałem nadzieję, że jest jakiś inny elegancki sposób kontrolowania przepływu w odniesieniu do iteracyjnych wywołań zwrotnych.
Odpowiedzi:
Alternatywa dla odpowiedzi @ tv:
Zauważ, że
.each()
sama jest synchroniczna - instrukcja następująca po wywołaniu.each()
zostanie wykonana dopiero po zakończeniu.each()
połączenia. Jednak operacje asynchroniczne rozpoczęte w.each()
iteracji będą oczywiście kontynuowane na swój własny sposób. Na tym polega problem: wezwania do zanikania elementów są animacjami sterowanymi zegarem, a te kontynuowane są we własnym tempie.Dlatego powyższe rozwiązanie śledzi liczbę wyblakłych elementów. Każde połączenie do
.fadeOut()
otrzymuje oddzwonienie zakończenia. Gdy wywołanie zwrotne zauważy, że jest liczone przez wszystkie pierwotne elementy, można podjąć pewne dalsze działania z pewnością, że wszystkie wygaszanie zostało zakończone.To czteroletnia odpowiedź (w tym momencie w 2014 r.). Nowoczesny sposób na to prawdopodobnie wymagałby użycia mechanizmu odroczenia / obietnicy, chociaż powyższe jest proste i powinno działać dobrze.
źródło
Prawdopodobnie jest za późno, ale myślę, że ten kod działa ...
źródło
Ok, może to być trochę po fakcie, ale .promise () powinien również osiągnąć to, czego szukasz.
Dokumentacja obietnicy
Przykład z projektu, nad którym pracuję:
:)
źródło
JavaScript działa synchronicznie, więc cokolwiek umieścisz po nim
each()
, nie będzie działać, dopóki nieeach()
zostanie ukończone.Rozważ następujący test:
Po wywołaniu alertu liczba wyniesie 1000000, ponieważ alert nie zostanie uruchomiony, dopóki nie
each()
zostanie zakończony.źródło
each
i zaplanujesz każdą animację osobno, nadal musisz uruchomić zdarzenie po animacji, a nie po każdej z nich.each()
problem. Dlatego wrzuciłem tę odpowiedź do miksu.each
nie były wcześniej gwarantowanealert
. czy mógłbyś mi to wyjaśnić lub wskazać na lekturę?Znalazłem wiele odpowiedzi dotyczących tablic, ale nie obiektu Json. Moim rozwiązaniem było po prostu iterowanie obiektu raz podczas zwiększania licznika, a następnie podczas iterowania obiektu w celu wykonania kodu można zwiększyć drugi licznik. Następnie po prostu porównujesz oba liczniki razem i dostajesz swoje rozwiązanie. Wiem, że to trochę niezgrabne, ale jak dotąd nie znalazłem bardziej eleganckiego rozwiązania. To jest mój przykładowy kod:
Jak powiedziałem, nie jest to najbardziej elegancki, ale działa i działa dobrze, a ja jeszcze nie znalazłem lepszego rozwiązania.
Pozdrawiam, JP
źródło
Jeśli chcesz zrobić to kilka kroków, może to zadziałać. Zależy to jednak od kolejności kończenia animacji. Nie sądzę, że powinien to być problem.
źródło
co powiesz na
źródło
Aby kolejność zadziałała, musisz ustawić w kolejce resztę żądania.
źródło
Napotykam ten sam problem i rozwiązałem go za pomocą następującego rozwiązania:
Rozwiązanie rozwiązuje następujący problem: zsynchronizować operacje asynchroniczne rozpoczęte w iteracji .each (), używając obiektu Odroczony.
źródło
Może spóźniona odpowiedź, ale istnieje pakiet do obsługi tego https://github.com/ACFBentveld/Await
źródło
Używam czegoś takiego:
źródło