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

时间:2016-02-19 16:16:27

标签: javascript mongodb asynchronous

我使用mongoDB的本机驱动程序。在db中我有大约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})
})

显然,这并不是我想要这样做,我试着玩弄承诺,但结果却更加困惑。

1 个答案:

答案 0 :(得分:0)

你可以用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})
    })