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/

相关文章:

spring - 包括 near 和 textcriteri 在内的多个标准在 spring data mongodb 中不起作用

javascript - 如何在不返回 Promise 的情况下从对象的 `get()` 获取异步数据

php - PHP 中的异步 HTTP 请求

javascript - 动态嵌套模型字段上的 Rails JavaScript 验证

javascript - 有什么方法可以逆转 Closure Compiler(或类似的)对代码的影响吗?

javascript - meteor Collection.insert() 不返回 Id

python - Pymongo:如何在文档中插入多个字段的数组?

javascript - 如何制作基本的所见即所得编辑器?

c# - Azure:无法执行套接字上的操作,因为系统缺乏足够的缓冲区空间或队列已满

c++ - 从 WinRT 中的异步任务 lambda 更新 UI