In Javascript, ci sono funzioni sincrone e asincrone .
Funzioni sincrone
La maggior parte delle funzioni in Javascript sono sincrone. Se dovessi chiamare diverse funzioni sincrone di fila
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
eseguiranno in ordine. doSomethingElse
non inizierà fino a quando non sarà doSomething
completato. doSomethingUsefulThisTime
, a sua volta, non si avvierà fino al doSomethingElse
completamento.
Funzioni asincrone
La funzione asincrona, tuttavia, non si aspetterà a vicenda. Diamo un'occhiata allo stesso esempio di codice che abbiamo avuto sopra, questa volta supponendo che le funzioni siano asincrone
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
Le funzioni verranno inizializzate in ordine, ma verranno eseguite approssimativamente allo stesso tempo. Non è possibile prevedere in modo coerente quale sarà il primo a finire: quello che per primo impiegherà il minor tempo possibile per terminare.
Ma a volte, si desidera che le funzioni asincrone vengano eseguite in ordine, e talvolta si desidera che le funzioni sincrone vengano eseguite in modo asincrono. Fortunatamente, questo è possibile con callback e timeout, rispettivamente.
callback
Supponiamo che abbiamo tre funzioni asincrone che vogliamo eseguire in ordine, some_3secs_function
, some_5secs_function
, e some_8secs_function
.
Poiché le funzioni possono essere passate come argomenti in Javascript, è possibile passare una funzione come callback da eseguire al termine della funzione.
Se creiamo le funzioni in questo modo
function some_3secs_function(value, callback){
//do stuff
callback();
}
quindi puoi chiamare quindi in ordine, in questo modo:
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.
});
});
});
timeout
In Javascript, puoi dire a una funzione da eseguire dopo un certo timeout (in millisecondi). In effetti, ciò può far sì che le funzioni sincrone si comportino in modo asincrono.
Se abbiamo tre funzioni sincrone, possiamo eseguirle in modo asincrono usando la setTimeout
funzione.
setTimeout(doSomething, 10);
setTimeout(doSomethingElse, 10);
setTimeout(doSomethingUsefulThisTime, 10);
Questo è, tuttavia, un po 'brutto e viola il principio DRY [wikipedia] . Potremmo risolverlo un po 'creando una funzione che accetta una matrice di funzioni e un timeout.
function executeAsynchronously(functions, timeout) {
for(var i = 0; i < functions.length; i++) {
setTimeout(functions[i], timeout);
}
}
Questo può essere chiamato così:
executeAsynchronously(
[doSomething, doSomethingElse, doSomethingUsefulThisTime], 10);
In breve, se si dispone di funzioni asincrone che si desidera eseguire in modo sincrono, utilizzare i callback e se si dispone di funzioni sincrone che si desidera eseguire in modo asincrono, utilizzare i timeout.