En Javascript, il y a synchrones et asynchrones fonctions.
Synchrone Fonctions
La plupart des fonctions en Javascript sont synchrones. Si vous deviez faire appel à plusieurs fonctions synchrones dans une rangée
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
elles s'exécutent dans l'ordre. doSomethingElse
ne démarre pas jusqu'à ce qu' doSomething
a terminé. doSomethingUsefulThisTime
, à son tour, ne démarre pas jusqu'à ce qu' doSomethingElse
a terminé.
Asynchrone Fonctions
Fonctions asynchrones, cependant, n'allons pas attendre les uns des autres. Penchons-nous sur le même exemple de code que nous avions ci-dessus, cette fois, en supposant que les fonctions sont asynchrones
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
Les fonctions seront initialisés dans l'ordre, mais ils seront tous d'exécuter à peu près à la même époque. Vous ne pouvez pas toujours de prévoir ce qui arrivera en premier: celui qui arrive à prendre le plus court laps de temps pour exécuter va finir premier.
Mais parfois, vous voulez fonctions qui sont asynchrones à exécuter dans l'ordre, et parfois, vous voulez les fonctions qui sont synchrones à exécuter de manière asynchrone. Heureusement, c'est possible avec les rappels et les délais d'attente, respectivement.
Rappels
Supposons que nous avons trois asynchrone fonctions 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és comme arguments en Javascript, vous pouvez passer une fonction comme une fonction de callback à exécuter une fois que la fonction est terminée.
Si nous créons les fonctions comme ceci
function some_3secs_function(value, callback){
//do stuff
callback();
}
ensuite, vous pouvez appeler puis 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.
});
});
});
Délais d'attente
En Javascript, vous pouvez dire une fonction à exécuter après un certain délai (en millisecondes). Cela peut, en effet, faire synchrone fonctions se comportent de manière asynchrone.
Si nous avons trois synchrone fonctions, on peut les exécuter de manière asynchrone à l'aide de l' setTimeout
fonction.
setTimeout(doSomething, 10);
setTimeout(doSomethingElse, 10);
setTimeout(doSomethingUsefulThisTime, 10);
C'est, cependant, un peu moche et viole le principe DRY[wikipedia]. Nous avons pu nettoyer un peu les par la création d'une fonction qui accepte un tableau de fonctions et un délai d'attente.
function executeAsynchronously(functions, timeout) {
for(var i = 0; i < functions.length; i++) {
setTimeout(functions[i], timeout);
}
}
Cela peut être appelé de la sorte:
executeAsynchronously(
[doSomething, doSomethingElse, doSomethingUsefulThisTime], 10);
En résumé, si vous avez asynchrone fonctions que vous souhaitez exécuter syncronously, utilisez des rappels, et si vous avez synchrone fonctions que vous souhaitez exécuter de manière asynchrone, utilisation de délais d'attente.