如何在继续Node.js之前等待函数完成

时间:2015-03-04 08:40:22

标签: javascript node.js asynchronous

我正在尝试在Node.js / Express中创建一个路径,该路由从两个查询中读取数据,然后根据来自queires的数据递增计数。由于Node.js是异步的,因此在读取所有数据之前显示总数。

我创建了一个简单的例子来说明我目前正在做的事情

var express = require('express');
var router = express.Router();


var total = 0;

/* GET home page. */
router.get('/', function(req, res, next) {
  increment(3);
  increment(2);
  console.log(total);
  res.end();
});



var increment = function(n){
    //Wait for n seconds before incrementing total n times
    setTimeout(function(){
    for(i = 0; i < n; i++){
        total++;
    }   
    }, n *1000);
};
module.exports = router;

我不确定在打印总数之前要等到两个功能完成后我必须做什么。我是否必须创建一个自定义事件发射器才能实现此目的?

2 个答案:

答案 0 :(得分:10)

拥抱异步性:

var express = require('express');
var router = express.Router();


var total = 0;

/* GET home page. */
router.get('/', function(req, res, next) {
  increment(3, function() {                 // <=== Use callbacks
      increment(2, function() {
          console.log(total);
          res.end();
      });
  });
});



var increment = function(n, callback){    // <=== Accept callback
    //Wait for n seconds before incrementing total n times
    setTimeout(function(){
        for(i = 0; i < n; i++){
            total++;
        }   
        callback();                        // <=== Call callback
    }, n *1000);
};
module.exports = router;

或使用promises库,或使用事件。最后,它们都是异步回调机制,语义略有不同。

答案 1 :(得分:2)

您可以使用async之类的库。

以下是代码:

var total = 0;
/* GET users listing. */
router.get('/', function(req, res) {
    async.series([
            function(callback){
                increment(2, function(){
                    callback(null, "done");
                });
            },
            function(callback){
                increment(3, function(){
                    callback(null, "done");
                });
            }
        ],
        function(err, result){
            console.log(total);
            res.send('respond the result:' + total);
        });
});

var increment = function(n, callback){
    //Wait for n seconds before incrementing total n times
    setTimeout(function(){
        for(var i = 0; i < n; i++){
            total++;
        }
        callback();
    }, n *1000);
};