Mam następujący kod JavaScript:
$('a.button').click(function(){
if (condition == 'true'){
function1(someVariable);
function2(someOtherVariable);
}
else {
doThis(someVariable);
}
});
Jak mogę się upewnić, że function2
wywołanie nastąpi dopiero po function1
zakończeniu?
javascript
jquery
Rrryyyaaannn
źródło
źródło
function1
wykonywanie operacji asynchronicznej?Odpowiedzi:
Podaj anonimowe wywołanie zwrotne i spraw, aby funkcja1 zaakceptowała je:
źródło
...do stuff
zawiera rzeczy asynchroniczne? Funkcja 2 nadal nie uruchomi się zgodnie z oczekiwaniami. Przykład w moim powyższym komentarzu pokazuje, że ponieważfoo()
funkcja zawiera kod asynchroniczny,bar()
nie uruchamia swojej zawartości po zakończeniufoo()
wykonywania zawartości, nawet używając$.when().then()
wywoływania ich jedna po drugiej. Ta odpowiedź jest poprawna tylko wtedy, gdy (i tylko wtedy) wszystkie elementy...do stuff
w twoim kodzie są ściśle synchroniczne.callBack()
po wykonaniu wszystkich n wywołań asynchronicznych. Ponieważ OP nie wspomniał o tym, co robi w funkcji, przyjęto, że jest to wywołanie asynchroniczne na jednym poziomie.Jeśli używasz jQuery 1.5, możesz użyć nowego wzorca Deferreds:
Edytuj: Zaktualizowany link do bloga:
Rebecca Murphy świetnie napisała na ten temat tutaj: http://rmurphey.com/blog/2010/12/25/deferreds-coming-to-jquery/
źródło
$.when(function1).then(function2);
(bez nawiasów wywołujących tę funkcję)?function1
powinien zwrócić obietnicę. W takim przypadku musi to być faktycznie wykonywana funkcja, a nie odwołanie. Kiedyresolve
zostaje przywołana ta obietnica,function2
zostaje wykonana. Można to łatwo wytłumaczyć, zakładając, żefunction1
ma wywołanie ajax.done
Zwrotna będzie wtedy rozwiązać obietnicy. Mam nadzieję, że to jasne.Spróbuj tego :
źródło
Ta odpowiedź używa standardowej
promises
funkcji JavaScriptECMAScript 6
. Jeśli twoja platforma docelowa nie obsługujepromises
, wypełnij ją PromiseJs .Obietnice to nowy (i znacznie lepszy) sposób obsługi operacji asynchronicznych w JavaScript:
Może to wydawać się znaczącym narzutem w tym prostym przykładzie, ale w przypadku bardziej złożonego kodu jest to znacznie lepsze niż używanie wywołań zwrotnych. Możesz łatwo łączyć wiele wywołań asynchronicznych za pomocą wielu
then
instrukcji:Możesz także łatwo owinąć odroczenia jQuery (które są zwracane z
$.ajax
połączeń):Jak zauważył @charlietfl,
jqXHR
obiekt zwrócony przez$.ajax()
implementujePromise
interfejs. Tak więc nie jest konieczne pakowanie go wPromise
, można go użyć bezpośrednio:źródło
Promise.resolve
owijanie$.ajax
jest anty-wzorzec, ponieważ$.ajax
zwraca niewykonalną obietnicęPromise
, po prostu implementuje interfejs. Nie jestem pewien, jak się zachowuje przy przekazywaniu wartości rzeczywistejPromise
do jegothen
metody, ani coPromise.all
zrobiłby, gdyby ajqXHR
i aPromise
zostały do niej przekazane. W tym celu muszę przeprowadzić dalsze testy. Ale dziękuję za podpowiedź, dodam ją do odpowiedzi!$.ajax.then
nie jest nowyMożesz też wywołać zdarzenie niestandardowe po zakończeniu jednej funkcji, a następnie powiązać ją z dokumentem:
Korzystając z tej metody, funkcja „b” może wykonać tylko PO funkcji „a”, ponieważ wyzwalacz istnieje tylko po zakończeniu wykonywania funkcji a.
źródło
możesz to zrobić w ten sposób
źródło
Zależy to od tego, co robi funkcja 1.
Jeśli funkcja1 wykonuje prosty, zsynchronizowany skrypt javascript, np. Aktualizuje wartość div lub coś takiego, funkcja 2 uruchomi się po zakończeniu funkcji 1.
Jeśli funkcja1 wykonuje wywołanie asynchroniczne, takie jak wywołanie AJAX, musisz utworzyć metodę „wywołania zwrotnego” (większość funkcji API ajax ma parametr funkcji wywołania zwrotnego). Następnie wywołaj funkcję 2 w wywołaniu zwrotnym. na przykład:
źródło
Jeśli metoda 1 musi zostać wykonana po metodzie 2, 3, 4. Poniższy fragment kodu może być rozwiązaniem tego problemu za pomocą Odroczonego obiektu w JavaScript.
źródło
Jeśli funkcja1 jest funkcją synchronizacji, którą chcesz przekształcić w funkcję asynchroniczną, ponieważ jej ukończenie zajmuje trochę czasu i nie masz nad nią kontroli, aby dodać wywołanie zwrotne:
Dane wyjściowe będą:
... i po 2 sekundach:
Działa to, ponieważ wywołanie metody window.setTimeout () doda zadanie do pętli zadań środowiska wykonawczego JS, co wykonuje wywołanie asynchroniczne, oraz ponieważ podstawowa zasada „uruchamiania do zakończenia” środowiska wykonawczego JS zapewnia, że onClick () nigdy nie jest przerywany przed końcem.
Zauważ, że jest to tak zabawne, jak trudny do zrozumienia kod ...
źródło