javascript - 尝试了解如何在js中使用Promise

标签 javascript mongodb asynchronous

我正在使用 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/

相关文章:

ios - 下载数据异步ios

javascript - Angular 4 : Scroll to top of page programmatically

javascript - 在 Typescript 中读取 csv 文件

javascript - 在页面加载时使用 Shopify 运行 Javascript 函数

javascript - NPM 每周下载量为零

mongodb - 无法在 ubuntu 18.04 LTS 上正确安装 mongodb

c# - Mutex/Monitor 不适用于 C# 线程同步

javascript - mongodb:从嵌套的引用数组中提取一项

node.js - Mongoose 映射减少()

entity-framework - Entity Framework 异步与 Task.FromResult