2017-09-01 72 views
0

我知道這是一個關於stackoverflow的熱門話題,但是我在用promise函數填充外部對象時遇到了一個問題。用承諾推送到映射函數內部的外部對象

所以基本上我想做的事:

  • 通過一個承諾得到我想要在這個陣列與地圖功能遍歷
  • 迭代對象的數組。呼叫在每次迭代
  • 一個承諾之後第二個承諾解決我要推一個ID,承諾到一個數組

當然,我不能用一個全局對象的結果,因爲承諾將不會在正確的範圍。我也嘗試過使用Bluebird Promise.map函數,但是這種方式我不能將對象推到對象上,而不是隻有第二個promise結果。

這是我的代碼到目前爲止。 PromiseTwo應填入一個對象,我想在res.json函數來顯示(這是一個Express /應用的NodeJS)

let promise = actie.groupActies() 
let akties = {} 
promise.then(function(aktieMaanden) { 
    let values = aktieMaanden.forEach((aktie) => { 
     let aktieId = aktie['_id'] 
     let artikelen = aktie['artikelen'] 
     let promiseTwo = order.getActieArtikelenOmzet(artikelen) 
     promiseTwo.then(function(orders) { 
      akties[aktieId] = orders 
      return akties 
     }) 
    }) 
    return akties 
}).then((akties) => { 
    res.json({ message: "Omzet voor aktie", akties: akties }) 
}) 

回答

1

通過一個承諾獲得對象的數組我想遍歷

actie.groupActies() 

遍歷這個陣列的映射函數。呼叫在每次迭代

.then(acties => Promise.all(
    acties.map(actie => 
    order.getActieArtikelenOmzet(actie.artikelen) 
    .then(orders => [actie._id,orders]) 
) 
)) 

一個承諾之後第二個承諾解決我想ID和承諾的結果推到一個數組

.then(results=> res.json({results})) 

主要的想法在這裏是使用Promise.all,以便它只在全部訂單完成時纔會繼續。

+0

是超好,爲表示感謝。訣竅是在.the(訂單=> [actie._id,訂單],它返回的對象 我甚至可以將其與更小的Promise.map寫: \t'actie.groupActies() \t。然後(acties => Promise.map(acties,actie => \t order.getActieArtikelenOmzet(actie.artikelen) \t。然後(訂單=> [actie._id,訂單]) \t)) \t。然後(結果=> { \t \t res.json({消息: 「Omzet VOOR aktie」,akties:結果}) \t})' –

+0

@patrick steenks那一個好的解決方案太。 Ypu可以作爲未來讀者的答案......(實際上,我的解決方案確實會返回一個二維數組,而不是一組對象;) –

+0

這樣做,謝謝。現在正在處理返回一組對象:) –

0

在闡述喬納斯的答案W,使用Promise.map以下工作還有:

actie.groupActies() 
.then(acties => 
    Promise.map(acties, actie => 
     order.getActieArtikelenOmzet(actie.artikelen) 
     .then(orders => [actie._id,orders]) 
    ) 
) 
.then(results => { 
    res.json({ message: "Omzet voor aktie", akties: results}) 
})