在循环中的承诺,完成后做点什么
题
基本上,我正试图弄清楚在一个循环中做一堆查询的方法,然后一旦完成所有完成的东西就会做某事。
我才能上班,但只因为我使用了这个伟大的图书馆,将所有的曼德布包裹着承诺。
var mongo = require('mongod')
var db = mongo('mongodb://localhost/builder', ['block''])
var block_ids = ['538d097bbb12479d0e9f70ab', '538ddc7d06c1f0fe296178b1'];
var prom = null;
var blocks = [];
for (i in block_ids) {
var block_id = block_ids[i];
prom = db.block.findOne({_id:db.ObjectId(block_id)})
.then(function(results) {
blocks.push(results);
})
}
prom.done(function() {
console.dir(blocks)
console.log("DONE! " + blocks.length)
})
.
我的问题是这个。在没有承诺的情况下,你可以在地球上做些什么?看起来它会如此艰难!
解决方案
休留循环
var mongo = require('mongod')
var db = mongo('mongodb://localhost/builder', ['block''])
var block_ids = ['538d097bbb12479d0e9f70ab', '538ddc7d06c1f0fe296178b1'];
Q(block_ids.map(function(block_id) {
return db.block.findOne({_id:db.ObjectId(block_id)});
})).all().done(function(blocks) {
console.dir(blocks)
console.log("DONE! " + blocks.length)
});
.
我才能上班,但只因为我使用了这个伟大的图书馆,将所有的曼德布包裹着承诺。
在蓝鸟刚刚完成了promisifyAll(require("mongodb"))
而不是等待某人制作模块。
其他提示
您可以使用一个简单的变量来计算响应的数量:
var responses = 0;
var blocks = [];
for(var i=0; i<block_ids.length; i++) {
var block_id = block_ids[i];
db.block.findOne({_id:db.ObjectId(block_id)}, function (err, result) {
if(err) {
console.log(err);
}
responses++;
blocks.push[result];
if (responses === block_ids.length-1) {
console.log('all find queries have responded');
// do whatever
}
}
}
. 不隶属于 StackOverflow