【问题标题】:Trying to understand how to use Promise in js试图了解如何在 js 中使用 Promise
【发布时间】:2016-06-01 07:05:09
【问题描述】:

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

显然我不想这样做,所以我试着玩弄 Promise,但结果更加困惑。

【问题讨论】:

  • 我错过了一个特定的问题?还是您想“修复”代码?
  • 查看this 或者不使用promise,您可以将每个调用嵌套在回调函数中,但从长远来看,promise 会让您更快乐。
  • 好吧,我想我想要“修复”代码。但获得某种提示显然会有所帮助。

标签: javascript mongodb asynchronous


【解决方案1】:

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

【讨论】:

  • 我会看看的。有些命令我从未使用过,所以我必须阅读它。
  • 如果我可以问。 ({name},i) 那等于什么?据我所知,这与使用 i 作为迭代器进行 for 循环相同,其中 name 表示集合中的元素?还是name代表json数据中name列的数据?
  • 现在可以使用,必须先更新 node.js,版本为 0.2.7!还必须使用 list.shift() 来删除第一个多余的集合名称;系统索引。然后我不得不将 ({name},i) 更改为 (name,i)。否则真棒!谢谢!
  • ({name},... ) 是 es6 对象解构。前任。 var object = {key: 'value'} // this 等于... var key = object.key // this var {key} = object
  • 你可以阅读更多关于解构here
猜你喜欢
  • 1970-01-01
  • 2020-05-28
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
相关资源
最近更新 更多