节点JS – 处理多个查询(承诺,蓝鸟)

我很好,如果新的Node JS(我使用MongoDB,Express和Mongoose),我有以下问题:

有一个包含10个地址标识的数组,我需要在做其他事情之前检查所有地址是否在数据库中。 我知道mongoose使asynchronous查询,我试图使用蓝鸟( https://www.npmjs.com/package/bluebird )作出承诺,但仍然没有运气:

这里有一些尝试:

1

var checkIds = function(idsArray){ return new Promise(function(resolve, reject){ var result = undefined; idsArray.forEach(function(id){ Address.count({_id: id}, function(err, count){ //count is 0 if id does not exist if(err || !count){ reject(false); } }); resolve(true); }); } } 

第2

 var checkIds = function(idsArray){ return new Promise(function(resolve, reject){ var result = 0; for(var i = 0; i < idsArray.lenght; i++){ Address.count({_id: idsArray[i]}, function(err, count){ if(err || !count){ reject(false); }else{ result++; } }); } resolve(result == 10 ? true : false); }); } 

即使数组只包含有效的ID,第一次尝试的promise返回值总是未定义的 ,第二次的返回值也是false

谁能帮我 ?

你可以尝试的是这样的

 model.find({ '_id': {$in: idsArray} }, function(err, docs) { if(docs.length == 10) { console.log("Your 10 docs with the 10 Ids are in your Database"); } }) 

你甚至可以用这个“count”

 model.count({ '_id': {$in: idsArray} }, function(err, count) { if(count == 10) { console.log("Your 10 docs with the 10 Ids are in your Database"); } }) 

有可能promisify MongoDB的方法,使查询,使这更容易,但你也可以只是创build一个promise的数组,并使用Promise.all

 var checkIds = function(idsArray){ var promises = []; idsArray.forEach(function(id){ var promise = new Promise(function(resolve, reject){ Address.count({_id: id}, function(err, count){ if(err or !count){ reject(false); } else { resolve(true); } }); }); promises.push(promise); } return Promise.all(promises); } 

然后呢

 checkIds(['id1', 'id2', 'id3']).then(function(values) { // success }, function(reason) { // fail })