2016-02-19 66 views
1

我正在使用mongoDB的本地驅動程序。在數據庫中我有大約7個集合,我想創建一個變量來存儲每個集合中的條目數量減去最後一個集合。之後,我想創建另一個變量來存儲最後一個集合的條目,然後我想通過res.render()命令傳遞變量並將其顯示在網頁上。試圖瞭解如何在js中使用Promise

我在這裏遇到的問題是,我很習慣於在這種情況下直接進入窗口的功能的同步執行。

下面的代碼是我想,如果一切都在同步執行的方式。

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}) 
}) 

顯然,這並不希望做我想做的事情,所以我試圖用承諾玩耍,但最終被更糊塗了。

+0

我錯過了一個具體的問題?或者你想讓代碼「固定」? – Sonata

+0

看看[this](http://stackoverflow.com/questions/23597059/promise-and-nodejs-mongodb-driver)或者使用承諾,你可以在回調函數中嵌套每個調用,但承諾會讓你很多長遠來看更快樂。 – metame

+0

嗯,我想我想要的代碼「固定」。但獲得某種提示顯然會有所幫助。 – user5232061

回答

0

你可以做這樣的事情與承諾:

獲取集合名稱,在它們之間迭代,並返回要麼算,或條目(如果它是最後的集合)。然後總結個人計數並將所有內容發送給客戶。

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}) 
    }) 
+0

我會看看它。有一些我從未使用過的命令,所以我必須閱讀它。 – user5232061

+0

如果我可以問。 ({姓名},我)這是什麼等於?從我可以告訴它與用i作爲迭代器創建for循環一樣,並且name代表集合中的元素?或者名稱是否代表json數據中名稱列中的數據? – user5232061

+0

讓curr後代碼似乎不運行。 – user5232061