嗨我在nodejs上有三个函数。
var one = function(){ implementation };
var two = function(){ implementation };
var three = function(){ implementation };
现在,第一个和第二个函数是独立的,但是函数三只能在函数一和二完成执行时才能运行。我不想在函数一中嵌套函数二,因为它们可以并行运行;是否有可能在nodejs中做到这一点?
答案 0 :(得分:2)
在这种情况下,我会使用旗帜。
(function() {
//Flags
oneComplete = false;
twoComplete = false;
one(function() {
oneComeplete = true;
if (oneComplete && twoComeplete) {
three();
}
});
two(function() {
twoComeplete = true;
if (oneComplete && twoComeplete) {
three();
}
});
})();
一旦完成执行,它将进入回调并检查两()是否完成。如果是这样,它将运行三()。
如果两个首先完成执行,那么它将检查oneComplete并运行three()
如果您需要添加更多功能(如one()和two()),此解决方案将无法扩展。对于这种情况,我建议https://github.com/mbostock/queue
答案 1 :(得分:2)
您可以使用的最佳和最具伸缩性的解决方案是使用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);
}]
});
答案 2 :(得分:0)
要在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);