繁体   English   中英

试图了解如何在js中使用Promise

[英]Trying to understand how to use Promise in js

我正在为mongoDB使用本机驱动程序。 在数据库中,我大约有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})
})

显然,这并不是我不想做的,所以我试着兑现诺言,但最终变得更加困惑。

您可以使用Promises做类似的事情:

获取集合名称,对其进行迭代,然后返回计数或条目(如果它是最后一个集合)。 然后汇总各个计数并将所有内容发送给客户端。

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})
    })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM