【问题标题】:Making Node.js code run in series让 Node.js 代码串联运行
【发布时间】:2015-04-20 03:18:38
【问题描述】:

所以我最近开始使用 Node.js,它以一种我以前见过的方式向我展示了异步代码。然而,我面临的问题是节点节点几乎异步执行函数调用(如果我理解正确的话)。所以我有两个函数A, B 执行一些数据库操作。函数A 需要在B 启动之前完成。但是我意识到,在B 之后调用A 显然并不能解决问题。所以我认为节点要做的事情是有一个回调:)。但我的制作应用程序可能会有从 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);

【问题讨论】:

标签: javascript node.js


【解决方案1】:

如果您只是将两个函数链接在一起,我会使用传统的回调。但是如果你有一堆依赖于彼此的各种组合,我会推荐 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");
  }
});

【讨论】:

    【解决方案2】:

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

    您可以使用回调。我不知道你的函数在做什么,所以我下面的例子都是使用 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);
    

    你也可以使用 Promise,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 库或异步工作流的方法有很多种。这些只是几个例子。

    编辑:已编辑以包含指向引用库的链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-25
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      • 2015-12-17
      • 2013-01-29
      • 2018-02-27
      相关资源
      最近更新 更多