Nodejs函数依赖

时间:2014-02-14 05:08:02

标签: javascript node.js asynchronous express nonblocking

嗨我在nodejs上有三个函数。

var one = function(){ implementation };
var two = function(){ implementation };
var three = function(){ implementation };

现在,第一个和第二个函数是独立的,但是函数三只能在函数一和二完成执行时才能运行。我不想在函数一中嵌套函数二,因为它们可以并行运行;是否有可能在nodejs中做到这一点?

3 个答案:

答案 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);

Demo