您可以使用的最佳和最具扩展性的解决方案是使用 async.auto() ,它并行执行函数并尊重每个函数的依赖关系:
async.auto()
async.auto({ one: function(callback) { // ... callback(null, some_result); }, two: function(callback) { // ... callback(null, some_other_result); }, three: ['one', 'two', function (callback, results) { console.log(results.one); console.log(results.two); }] });
要在javascript中异步运行函数,可以使用setTimeout函数。
function one(){ console.log(1); } function two(){ console.log(2); } setTimeout(function(){ one(); }, 0); setTimeout(function(){ two(); }, 0);
在node.js中,您可以使用异步库
var http = require('http'); var async = require("async"); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'}); async.parallel([function(callback) { setTimeout(function() { res.write("1st line<br />");}, Math.round(Math.random()*100)) }, function(callback) { setTimeout(function() { res.write("2nd line<br />");}, Math.round(Math.random()*100)) }, function(callback) { setTimeout(function() { res.write("3rd line<br />");}, Math.round(Math.random()*100)) }, function(callback) { setTimeout(function() { res.write("4th line<br />");}, Math.round(Math.random()*100)) }, function(callback) { setTimeout(function() { res.write("5th line<br />");}, Math.round(Math.random()*100)) }], function(err, results) { res.end(); } ); }).listen(80);
演示
在这种情况下,我会使用旗帜。
(function() { //Flags oneComplete = false; twoComplete = false; one(function() { oneComeplete = true; if (oneComplete && twoComeplete) { three(); } }); two(function() { twoComeplete = true; if (oneComplete && twoComeplete) { three(); } }); })();
一旦完成执行,它将进入回调并检查两()是否完成。如果是这样,它将运行三()。
再次如果两个先完成执行,那么它将检查oneComplete并运行三()
如果您需要添加更多函数(如one()和two()),此解决方案将无法扩展。对于这种情况,我建议 https://github.com/mbostock/queue