W jaki sposób kod JavaScript staje się asynchroniczny podczas korzystania z wywołań zwrotnych?

26

Dużo czytam w Internecie, próbując dowiedzieć się, jak napisać asynchroniczny kod JavaScript. Jedną z technik, która pojawiła się często w moich badaniach, jest użycie wywołań zwrotnych. Chociaż rozumiem proces pisania i wykonywania funkcji wywołania zwrotnego, jestem zdezorientowany, dlaczego wywołania zwrotne automagicznie sprawiają, że wykonywanie JavaScript jest asynchroniczne. Moje pytanie brzmi zatem: w jaki sposób dodanie funkcji wywołania zwrotnego do mojego kodu JavaScript powoduje automatyczną asynchronizację tego kodu?

Zach Dziura
źródło
2
Być może zainteresuje Cię lektura, w jaki sposób przeglądarka osiąga to w ramach jednego wątku, napisanego przez Johna Resiga: ejohn.org/blog/how-javascript-timers-work
Jalayn
@Jalayn. Dzięki. Twój komentarz zrobił różnicę po przeczytaniu kilku odpowiedzi.
kushalvm

Odpowiedzi:

26

Tak nie jest. Samo oddzwonienie lub przekazanie oddzwonienia nie oznacza, że ​​jest on asynchroniczny.

Na przykład .forEachfunkcja odbiera połączenie zwrotne, ale jest synchroniczna.

var available = false;
[1,2,3].forEach( function(){
    available = true;
});
//code here runs after the whole .forEach has run,
//so available === true here

setTimeoutTrwa zbyt zwrotnego i jest asynchroniczne.

function myFunction( fn ) {
    setTimeout( function() {
        fn(1,2,3);
    }, 0 );
}

var available = false;
myFunction( function() {
    available = true;
});
//available is never true here

Podłączenie do dowolnego zdarzenia asynchronicznego w JavaScript zawsze wymaga wywołania zwrotnego, ale to nie znaczy, że wywoływanie funkcji lub przekazywanie ich jest zawsze asynchroniczne.

Esailija
źródło
2
@ SteveEvers Chyba mógłbyś wtedy edytować artykuł MDN . Oddzwanianie jest bardzo popularnym terminem w javascript dla każdej funkcji przekazywanej do innej, która oddzwania do ciebie za pomocą funkcji, którą dałeś ... po co to komplikować? Edycja: Oddzwanianie jest również używane w specyfikacjach
Esailija,
3
@SteveEvers „wywołanie zwrotne oznacza asynchronię” jest cechą C # / Microsoft. en.wikipedia.org/wiki/Callback_(computer_programming)
Esailija
1
@MikeBrown Chyba przeczytałem za dużo w jego profilu, a ta - najbardziej pozytywna odpowiedź z pewnością daje wyobrażenie, że „wywołania zwrotne oznaczają asynchronię”.
Esailija,
1
Ale powiedzenie @SteveEvers jest również błędne. Oddzwanianie nie oznacza asynchronizacji, tylko to, że ktoś inny będzie odpowiedzialny za „oddzwanianie”.
Michael Brown
1
+1, ponieważ Steve Evers się myli
slebetman
23

Sekret „magii” polega na tym, że zdarzenia, do których przypisujesz wywołania zwrotne, są asynchroniczne. Są one wdrażane „pod maską”, aby zająć się wszystkim, co robią (np. Odzyskiwanie czegoś ze zdalnego serwera) w tle, poza piaskownicą JS. A potem, kiedy skończą swoją pracę, przekazują silnikowi JS komunikat o wywołaniu zdarzenia. Gdy silnik JS zakończy działanie tego, co aktualnie robi, wywoła wszelkie zdarzenia, które są w kolejce (lub poczekają na nową wiadomość), a następnie Twoje wywołanie zwrotne zostanie „magicznie” wywołane asynchronicznie!

( UWAGA: jest to bardzo ogólny, koncepcyjny przegląd tematu, który nie wchodzi w szczegóły, ponieważ różne silniki JS będą wdrażać różne rzeczy. Ale to jest ogólny pomysł na to, jak to działa.)

Mason Wheeler
źródło
Jakie to są wydarzenia? Przykład jednego lub dwóch takich wydarzeń sprawi, że Twoja odpowiedź będzie jeszcze lepsza.
Jo Smo