asynchronous运行三个函数,等待三个函数完成

在下面的函数start中,连续调用三个函数。 所有的函数执行完毕后,容器函数的start被再次调用。

有没有办法,我可以并行或asynchronous地运行这三个函数,当所有三个函数完成时,再次调用start方法。

 function start(){ resolveErrorQueue((err,data)=>{ if(err) console.log(err); else{ checkIfAlive((err,data) => { if(err) console.log(err); else{ prepareServer((err,data) => { if(err) console.log(err); else start(); }); } }); } }); } 

最干净的方式是使用承诺库。 例如,在Q中,您可以使用q.all函数

 Q.all([getFromDisk(), getFromCloud()]).done(function (values) { assert(values[0] === values[1]); // values[0] is fromDisk and values[1] is fromCloud }); 

如果你想做的事情没有承诺,你可以创build一个全局variables,每当一个asynchronous函数完成时就增加一个全局variables。 然后调用你的3个asynchronous函数,并在callback中增加全局variables。 如果需要,您还可以在全球存储返回数据。

然后可以使用while循环或setInterval来检查3个函数是否全部返回。

使用asynchronous模块的并行 :

 async.parallel([resolveErrorQueue, checkIfAlive, prepareServer], (err, results) => { if (err) console.error(err); else start(); }); 

由于您的方法似乎与callbackasync模块将适合。 如果方法也支持承诺,那么也可以完成,例如使用Bluebird Promise.join或Q.all(如@ user2263572所述)。

我同意user2263572的答案 ,你应该使用承诺。 自从v4.7.1以来,使用由Node.js本地支持的ES6 Promise更为简单。

这是一个工作的例子:

 function resolveErrorQueue(resolve, reject) { setTimeout(() => { resolve("no errors in queue"); }, 1000); } function checkIfAlive(resolve, reject) { setTimeout(() => { resolve("server is alive"); }, 999); }; function prepareServer(resolve, reject) { setTimeout(() => { resolve("server is prepared"); }, 1001); }; var counter = 0; function start() { Promise.all([new Promise(resolveErrorQueue), new Promise(checkIfAlive), new Promise(prepareServer)]).then(values => { console.log(`${++counter}: ${values}`); start(); }); } start(); 

不完全确定你在做什么,但可能是这样的?

 function start(){ var leftToRun = 3; resolveErrorQueue((err,data)=>{ if(err) console.log(err); else{ if (--leftToRun === 0) { start(); } } }); checkIfAlive((err,data) => { if(err) console.log(err); else{ if (--leftToRun === 0) { start(); } } }); prepareServer((err,data) => { if(err) console.log(err); else if (--leftToRun === 0) { start(); } }); } 

它不会实际上并行运行,因为Node只在一个线程中运行你的代码,但是如果你调用的操作是asynchronous的,那么函数不必按顺序完成。

你可以在nodejs中使用async.series()方法。 async是一个模块,它提供了在nodejs执行asynchronous方法的各种方法。

例如:

 async.series([function1,function2,function3],function(err,result{ if(err){ // do here if error occured. } console.log(result); // DO here what you want to do after function1, function2 and function3 completion. }); var function1 = function(cb){ // do here in function1 cb(null,'ok'); }; var function2 = function(cb){ // do here in function2 cb(null,'ok'); }; var function3 = function(cb){ // do here in function3 cb(null,'ok'); }; 

您可以在async.series()添加任意数量的函数作为参数。