我正在尝试在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;
我不确定在打印总数之前要等到两个功能完成后我必须做什么。我是否必须创建一个自定义事件发射器才能实现此目的?
答案 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);
};