我正在使用 mongoDB 的 native 驱动程序。在数据库中,我有大约 7 个集合,我想创建一个变量来存储每个集合中减去最后一个集合的条目数量。之后我想创建另一个变量来存储最后一个集合的条目,然后我想通过 res.render() 命令传递变量并将其显示在网页上。
我在这里遇到的问题是,我太习惯同步执行函数了,在这种情况下,这些函数直接超出了窗口。
如果一切都同步执行,下面的代码就是我的想法。
var count = 0;
db.listCollections().toArray(function(err,collection){
for(i = 1; i < collection.length;i++){
db.collection(collection[i].name).count(function(err,value){
count = count + value;
})
}
var count2 = db.collection(collection[i].name).count(function(err,value){
return value;
})
res.render('index.html',{data1: count, data2: count2})
})
显然这并不是我想要的,所以我尝试玩弄 promise ,但最终变得更加困惑。
最佳答案
你可以用 Promise 做这样的事情:
获取集合名称,迭代它们,然后返回计数或条目(如果它是最后一个集合)。然后汇总各个计数并将所有内容发送给客户。
db.listCollections().toArray()
.then(collections => {
let len = collections.length - 1
return Promise.all(collections.map(({name}, i) => {
let curr = db.collection(name)
return i < len ? curr.count() : curr.find().toArray()
}
))
}
)
.then(res => {
let last = res.pop(),
count = res.reduce((p, c) => p + c)
res.render('index.html', {count, last})
})
关于javascript - 尝试了解如何在js中使用Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35509863/