W Javascript są funkcje synchroniczne i asynchroniczne .
Funkcje synchroniczne
Większość funkcji w Javascript jest synchroniczna. Gdybyś miał wywołać kilka funkcji synchronicznych z rzędu
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
wykonają w kolejności. doSomethingElse
nie rozpocznie się, dopóki się doSomething
nie zakończy. doSomethingUsefulThisTime
z kolei nie rozpocznie się, dopóki się doSomethingElse
nie zakończy.
Funkcje asynchroniczne
Jednak funkcje asynchroniczne nie będą na siebie czekać. Spójrzmy na ten sam przykład kodu, który mieliśmy powyżej, tym razem zakładając, że funkcje są asynchroniczne
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
Funkcje zostaną zainicjowane po kolei, ale wszystkie będą wykonywane mniej więcej w tym samym czasie. Nie możesz konsekwentnie przewidzieć, który z nich zakończy się pierwszy: ten, który zajmie najkrótszy czas, zakończy się jako pierwszy.
Ale czasami chcesz, aby funkcje, które są asynchroniczne, były wykonywane po kolei, a czasami chcesz, aby funkcje, które są synchroniczne, były wykonywane asynchronicznie. Na szczęście jest to możliwe odpowiednio w przypadku wywołań zwrotnych i limitów czasu.
Callback
Załóżmy, że mamy trzy funkcje asynchroniczne, które chcemy wykonać w kolejności some_3secs_function
, some_5secs_function
i some_8secs_function
.
Ponieważ funkcje mogą być przekazywane jako argumenty w JavaScript, możesz przekazać funkcję jako wywołanie zwrotne do wykonania po jej zakończeniu.
Jeśli stworzymy takie funkcje
function some_3secs_function(value, callback){
//do stuff
callback();
}
wtedy możesz zadzwonić po kolei, na przykład:
some_3secs_function(some_value, function() {
some_5secs_function(other_value, function() {
some_8secs_function(third_value, function() {
//All three functions have completed, in order.
});
});
});
Limity czasu
W JavaScript możesz nakazać funkcji, aby wykonywała się po określonym czasie (w milisekundach). W efekcie może to spowodować, że funkcje synchroniczne będą działać asynchronicznie.
Jeśli mamy trzy funkcje synchroniczne, możemy je wykonywać asynchronicznie za pomocą setTimeout
funkcji.
setTimeout(doSomething, 10);
setTimeout(doSomethingElse, 10);
setTimeout(doSomethingUsefulThisTime, 10);
Jest to jednak trochę brzydkie i narusza zasadę DRY [wikipedia] . Moglibyśmy trochę to uporządkować, tworząc funkcję, która akceptuje tablicę funkcji i limit czasu.
function executeAsynchronously(functions, timeout) {
for(var i = 0; i < functions.length; i++) {
setTimeout(functions[i], timeout);
}
}
Można to nazwać tak:
executeAsynchronously(
[doSomething, doSomethingElse, doSomethingUsefulThisTime], 10);
Podsumowując, jeśli masz funkcje asynchroniczne, które chcesz wykonywać synchronicznie, użyj wywołań zwrotnych, a jeśli masz funkcje synchroniczne, które chcesz wykonywać asynchronicznie, użyj limitów czasu.