使Node.js代码串行运行

时间:2015-02-18 22:28:17

标签: javascript node.js

所以我最近开始使用Node.js,它以我以前见过的方式向我展示了异步代码。然而,我面临的问题是节点节点几乎异步执行函数调用(如果我理解正确的话)。所以我有两个函数A, B执行一些数据库操作。函数A需要在B开始之前完成。但是我意识到只是在A之后调用B显然不会削减它。所以我认为节点要做的就是回调:)。但我的制作应用可能会有A到Z的系列,所以可能会变得混乱。但是我真的很感激如何在node.js中实现这样的回调。

var http = require('http');

function runAllFunc() {
  funcA();
  funcB();
};

var server = http.createServer(function(req,res) {
  syncFunc();
  res.writeHead(200, {'Content-Type':'text/plain'});
  res.end('dde');
}).listen(8080);

2 个答案:

答案 0 :(得分:4)

如果您只是将这两个函数链接在一起,我会使用传统的回调。但是如果你想要一堆依赖于彼此的各种组合,我会推荐async模块。 (https://github.com/caolan/async

以下是您如何执行上述示例。

var async = require('async');

var funcA = function() {
  console.log("I am function 1");
};

var funcB = function() {
  console.log("I am function 2");
};

async.auto({
  funcA: function(onADone) {
    funcA();  // call your first function here
    onADone();  // callback
  },
  funcB: ['funcA', function(onBDone) {
    // second function will not execute until first one is done
    // because it is specified above
    funcB();
    onBDone();  // callback
  }],
}, function(err, res) {
  if (err) {
    console.log("something went wrong " + err);
  } else {
    console.log("done");
  }
});

答案 1 :(得分:3)

有几种方法可以做到这一点。

您可以使用回调。我不知道你的函数在做什么,所以下面的例子都是使用setTimeout的简单异步示例。

function doFirstThing(callback) {
  setTimeout(function() {
    console.log('First Thing is done');
    if (callback) {
      callback();
    }
  }, 1000);
}
function doSecondThing(callback) {
  setTimeout(function() {
    console.log('Second Thing is done');
    if (callback) {
      callback();
    }
  }, 1000);
}

doFirstThing(doSecondThing);

你也可以使用promises,Bluebird(https://github.com/petkaantonov/bluebird)和Q(https://github.com/kriskowal/q)是我想到的两个库。这是Q的一个例子。

var Q = require('q');
function doFirstThing() {
  var deferred = Q.defer();
  setTimeout(function() {
    console.log('First Thing is done');
    deferred.resolve();
  }, 1000);
  return deferred.promise;
}
function doSecondThing() {
  var deferred = Q.defer();
  setTimeout(function() {
    console.log('Second Thing is done');
    deferred.resolve();
  }, 1000);
  return deferred.promise;
}

doFirstThing().then(doSecondThing).done();

另一个选项是async模块(https://github.com/caolan/async)。这是一个例子:

var async = require('async');
function doFirstThing(next) {
  setTimeout(function() {
    console.log('First Thing is done');
    next();
  }, 1000);
}
function doSecondThing(next) {
  setTimeout(function() {
    console.log('Second Thing is done');
    next()
  }, 1000);
}

async.series([doFirstThing, doSecondThing]);

当然,有许多不同的方法来设置回调,使用Promise库或使用async的工作流。这些只是几个例子。

编辑:编辑包含引用库的链接。