En Javascript, il existe des fonctions synchrones et asynchrones .
Fonctions synchrones
La plupart des fonctions en Javascript sont synchrones. Si vous appelez plusieurs fonctions synchrones d'affilée
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
ils exécuteront dans l'ordre. doSomethingElse
ne démarrera pas tant qu'il ne sera pas doSomething
terminé. doSomethingUsefulThisTime
, à son tour, ne démarrera pas tant qu'il ne sera pas doSomethingElse
terminé.
Fonctions asynchrones
La fonction asynchrone, cependant, n'attendra pas l'une l'autre. Regardons le même exemple de code que nous avions ci-dessus, en supposant cette fois que les fonctions sont asynchrones
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
Les fonctions seront initialisées dans l'ordre, mais elles s'exécuteront toutes à peu près en même temps. Vous ne pouvez pas toujours prédire lequel se terminera en premier: celui qui prendra le moins de temps à s'exécuter finira en premier.
Mais parfois, vous voulez que les fonctions asynchrones s'exécutent dans l'ordre, et parfois vous voulez que les fonctions synchrones s'exécutent de manière asynchrone. Heureusement, cela est possible avec les rappels et les délais d'attente, respectivement.
Rappels
Supposons que nous avons trois fonctions asynchrones que nous voulons exécuter dans l' ordre, some_3secs_function
, some_5secs_function
et some_8secs_function
.
Étant donné que les fonctions peuvent être passées en tant qu'arguments en Javascript, vous pouvez transmettre une fonction en tant que rappel à exécuter une fois la fonction terminée.
Si nous créons les fonctions comme celle-ci
function some_3secs_function(value, callback){
//do stuff
callback();
}
alors vous pouvez appeler alors dans l'ordre, comme ceci:
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.
});
});
});
Timeouts
En Javascript, vous pouvez dire à une fonction de s'exécuter après un certain délai (en millisecondes). Cela peut, en effet, amener les fonctions synchrones à se comporter de manière asynchrone.
Si nous avons trois fonctions synchrones, nous pouvons les exécuter de manière asynchrone en utilisant la setTimeout
fonction.
setTimeout(doSomething, 10);
setTimeout(doSomethingElse, 10);
setTimeout(doSomethingUsefulThisTime, 10);
Ceci est cependant un peu moche et viole le principe DRY [wikipedia] . Nous pourrions nettoyer un peu cela en créant une fonction qui accepte un tableau de fonctions et un délai d'expiration.
function executeAsynchronously(functions, timeout) {
for(var i = 0; i < functions.length; i++) {
setTimeout(functions[i], timeout);
}
}
Cela peut être appelé ainsi:
executeAsynchronously(
[doSomething, doSomethingElse, doSomethingUsefulThisTime], 10);
En résumé, si vous avez des fonctions asynchrones que vous souhaitez exécuter de manière synchrone, utilisez des rappels, et si vous avez des fonctions synchrones que vous souhaitez exécuter de manière asynchrone, utilisez des délais d'expiration.