簡體   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