2017-04-07 46 views
1

我需要調試此代碼的幫助/或學習有效的方法來做到這一點 - 我嘗試使用bluebird.each捕獲我的forEach中的所有執行,但沒有得到它的工作。與使用純javascript建立新承諾一樣。我需要幫助如何執行我的forEach FIRST並繼續前進。對CouchDB nano和forEach使用Promise

let arr = []; 
let fields = ['environment', 'habitat', 'earth] 
Promise.each(fields, field => { 
    nano.db.use(field).view('options', 'options') 
    .spread((body, header) => { 
     arr.push(body.rows); 
    }) 
}).then(() => console.log(arr)) 

-Expected結果:常用3至CONSOLE.LOG ====> [1,2,3,4,5]

- 實際結果:ARR是一個空數組====> []

我看到這是一個異步問題,但我似乎無法弄清楚如何實際完成這項工作。任何輸入或資源將不勝感激!

謝謝

回答

0

我還沒有實際運行你的代碼很抱歉,如果我不正確,但看着它與藍鳥文檔我假設的修正,你需要做的回報您的通話nano.db包裹在一個諾言Promise.each

let arr = []; 
let fields = ['environment', 'habitat', 'earth'] 
Promise.each(fields, field => { 
    return new Promise ((resolve, reject) => { 
    nano.db.use(field).view('options', 'options') 
     .spread((body, header) => { 
     arr.push(body.rows); 
     resolve(); 
     }) 
    }); 
}).then(() => console.log(arr)) 

裏面,我相信你的假設是正確的,你得到一個空數組時回來,而不是你所期望的具有不同步的問題。我假設.then方法在nano.db獲取數據之前觸發。

我將nano.db的調用包裝在承諾中,以便它將等待nano.db完成,因爲Promise.each支持在其中返回承諾。

藍鳥的承諾文檔陳述爲Promise.each

如果迭代函數返回一個承諾或thenable,那麼承諾的 結果與下一 迭代,然後再繼續等待。

所以,如果承諾未在您Promise.each和任何返回的是異步發生裏然後就像一個then或相同的情況下一個承諾一個catch方法。

因爲我不知道藍鳥可能會有一種方法來改變這個承諾,讓它更像藍鳥。我圍繞着nano.db調用的承諾只是一個正常的es6承諾,藍鳥可能會或可能不會有不同的api來創建承諾。