【发布时间】:2017-01-09 05:34:01
【问题描述】:
我正在使用 Nodejs,我想使用 Promise 以便在 for 循环后做出完整响应。
exports.getAlerts = function(req,res,next){
var detected_beacons = [];
if (!req.body || Object.keys(req.body).length == 0) {
res.status(401);
res.json({message:'No data sent'});
return
}
var nets = req.body.networks;
db.collection("beaconConfig", function(err, beaconConfigCollection){
if (!err){
var promises = [];
for(var i=0;i<nets.length;i++){
var defer = q.defer();
beaconConfigCollection.find({$or: [{"data.major" : nets[i].toString()},{"data.major" : nets[i]}], batteryLevel : {$lt : 70}}).toArray(function(errFind, saver){
if (!errFind && saver && saver.length > 0){
promises.push(defer.promise);
console.log("--------------------savers -------------------");
console.log(saver);
for(var j=0; j<saver.length;j++){
console.log("--------------------saver[j]-------------------");
console.log(saver[j]);
var detected = {}
var major = saver[j].data.major;
detected.major = major;
console.log("--------------------detected -------------------");
console.log(detected);
detected_beacons.push(detected);
defer.resolve(detected);
}
}
});
}
q.all(promises).then(function(results){
console.log("--------------------detected_beacons -------------------");
console.log(detected_beacons);
res.json(detected_beacons);
});
} else {
console.error(err);
res.status(500);
res.json({message:"Couldn't connect to database"});
}
});};
所有的 consoles.log 都可以正常工作,除非最后一个 ---detected_beacons--- 一个,这是第一个要显示的并且它是空的。
这就是为什么我认为承诺效果不佳的原因。我有 var q = require('q');在顶部,mongo 连接不会返回任何问题。
感谢您的帮助。
【问题讨论】:
-
因为
promises数组是异步填充的。 -
我该如何解决?
-
把
promises.push(defer.promise);放在异步回调之外?顺便说一句,你也得到了common closure in a loop problem。最好将promsification 的find分解为单独的函数。 -
@Bergi 你是对的!在循环中重用 Promise 是一种反模式。
-
我明白你们在说什么,但我无法修复错误。我已经多次更改代码,但发送的第一件事是空数组
标签: javascript node.js mongodb promise q