JavaScript: exécute la fonction asynchrone une par une

J'ai une fonction JS "Async" simple:

function asyncFunc(i) { setTimeout(function () { console.log(i); }, 1000); } 

Si je veux exécuter ce asyncFunc 5 fois dans une boucle for, c'est-à-dire un journal de 1 à 5 par seconde et coûte totalement 5 secondes.

1

2

3

4

5

Je sais que jQuery est quand (). Done () peut faire cela si je suis dans un environnement avec des bibliothèques de N ° 3 de JS, quelle est la manière la plus simple et la plus élégante d'y parvenir ?

En fait, par exemple, je souhaite écrire une fonction util qui accepte un tableau de fonctions asynchrones et cette fonction utilitaire peut exécuter les fonctions passées une par une:

 function execAsyncTasks([asyncTask1, asyncTask2, asyncTask3]) { asyncTask1(); // Wait until asyncTask1 finished asyncTask2(); // Wait until asyncTask2 finished asyncTask3(); // Wait until asyncTask3 finished } 

Toutes vos tâches devront implémenter une sorte de mécanisme de rappel, car c'est la seule façon de savoir qu'une tâche asynchrone a été complétée. Cela étant, vous pourriez faire quelque chose comme:

 function executeTasks() { var tasks = Array.prototype.concat.apply([], arguments); var task = tasks.shift(); task(function() { if(tasks.length > 0) executeTasks.apply(this, tasks); }); } executeTasks(t1, t2, t3, t4); 

Démonstration

Vous pouvez utiliser le module Async:

https://github.com/caolan/async

 async.parallel([ function(){ ... }, function(){ ... } ], callback); async.series([ function(){ ... }, function(){ ... } ]); 

C'est une approche de beaucoup

 function execAsyncTasks(asyncTask1, asyncTask2, asyncTask3) { var count = 0; function nextCommand() { switch (count) { case 0: asyncTask1(); break; case 1: asyncTask2(); break; case 2: asyncTask3(); default: return; } count++; setTimeout(nextCommand, 1000); } nextCommand(); } 

Vous pouvez disposer d'un mécanisme de synchronisation à l'aide de rappels et d'appels de fonctions récursives: voir http://jsfiddle.net

 function asyncFunc(i, callback) { setTimeout(function () { document.body.innerHTML +='<p>'+i+'</p>'; callback(); }, 1000); } var args = [0,1,2,3,4]; function loopThroughArgs(callback) { if(args.length == 0) { callback(); } else { asyncFunc(args[0], function() { args.splice(0,1); //remove the first item from args array loopThroughArgs(callback); }); } } loopThroughArgs(function() { document.body.innerHTML +='<p>done !</p>'; });