我有一个像这样的nodejs Mongodb代码。我试图推入全局数组并返回我的所有结果,但数组只包含一个值。知道为什么吗?
var s = [];
var p = function(){
return new Promise(function(resolve, reject) {
MongoClient.connect(url, function (err, db) {
db.listCollections().forEach(function(collname) {
db.collection(collname.name).find().sort( { duration_in_seconds: 1 }).limit(1).toArray(
function(err, docs) {
assert.equal(null, err);
s.push(docs);
resolve();
});
});
});
});
}
p().then(function() {
console.log(s);
});
答案 0 :(得分:2)
当第一个集合返回其文档时,您正在解析承诺。你需要等待所有这些。而不是将每个异步函数中的所有异步函数包装在一个大new Promise
,promisify中,并使返回的promise履行 结果值,而不是将其放在全局变量中:
function connect(url) {
return new Promise(function(resolve, reject) {
MongoClient.connect(url, function (err, db) {
if (err) reject(err);
else resolve(db);
});
});
}
function getArray(cursor) {
return new Promise(function(resolve, reject) {
cursor.toArray(function(err, docs) {
if (err) reject(err);
else resolve(docs);
});
});
}
现在,您可以使用这些帮助程序编写p
,将每个集合的promises放在一个数组中,然后使用Promise.all
等待它们,这将为所有结果的数组产生一个承诺:< / p>
function p() {
return connect(url).then(function(db) {
return getArray(db.listCollections()).then(function(collections) {
var promises = collections.map(function(collname) {
return getArray(db.collection(collname.name).find().sort({duration_in_seconds: 1 }).limit(1));
});
return Promise.all(promises);
});
});
}
p().then(function(s) {
console.log(s);
});