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

Javascript 如何在Node.js中继续之前等待函数完成,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我试图在Node.js/Express中创建一个路由,该路由从两个查询中读取数据,然后根据来自查询的数据增加一个计数。由于Node.js是异步的,所以在读取所有数据之前会显示我的总计 我创建了一个简单的例子,说明了我目前正在做的事情 var express = require('express'); var router = express.Router(); var total = 0; /* GET home page. */ router.get('/', function(req,

我试图在Node.js/Express中创建一个路由,该路由从两个查询中读取数据,然后根据来自查询的数据增加一个计数。由于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;
var express=require('express');
var router=express.router();
var合计=0;
/*获取主页*/
router.get('/',函数(req,res,next){
增量(3);
增量(2);
控制台日志(总计);
res.end();
});
变量增量=函数(n){
//等待n秒,然后再增加总数n次
setTimeout(函数(){
对于(i=0;i

我不确定要等到这两个函数都完成后再打印总数,我需要做什么。我是否必须创建自定义事件发射器才能实现此目标?

采用异步:

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;
var express=require('express');
var router=express.router();
var合计=0;
/*获取主页*/
router.get('/',函数(req,res,next){

增量(3,function(){/您可以使用类似的库

代码如下:

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);
};
var总计=0;
/*获取用户列表*/
router.get('/',函数(req,res){
异步系列([
函数(回调){
增量(2,函数(){
回调(空,“完成”);
});
},
函数(回调){
增量(3,函数(){
回调(空,“完成”);
});
}
],
函数(错误、结果){
控制台日志(总计);
res.send('响应结果:'+总计);
});
});
var增量=函数(n,回调){
//等待n秒,然后再增加总数n次
setTimeout(函数(){
对于(变量i=0;i
您传递回调。事件发射器也可以工作。或者承诺。将问题想象为必须“等待”直到某件事情发生错误。您更应该将其想象为“我如何知道X何时完成才能运行Y”。回调、事件或承诺都是该问题的解决方案。