2017-07-06 74 views
0

我面臨複雜的承諾鏈,看起來結果並不等待承諾的結束。循環中的鏈接承諾

return Promise.all([ 
    Radar.newRadar(1), 
    Radar.newRadar(2), 
    Radar.newRadar(3) 
]) 
.then(newRadarIds => { 
    let RadarNotes = []; 
    return Promise.all([ 
    _.map(newRadarIds, (radar_id) =>{ 
     return Promise.all([ 
     Radar.init(radar_id) 
     ]) 
     .then(kpis => { 
     return Promise.all([ 
      Radar.addKpis(radar_id.radar_id, ...) 
     ]) 
     .then(radarAddKpi => { 
      RadarNotes.push({ 
      year : radar_id.year, 
      data : kpis[0].data}); 
      console.log('in map') 
      // return { 
      // year : radar_id.year, 
      // data : kpis[0].data} 
     }) 
     .catch(err => { 
      console.error(err); 
     }) 
     }) 

    }) //end map 
    ]) 
    .then(result => { 
    console.log('her222e') 
    res.json(result) 
    }) 
    .catch (err => { 
    console.error(err); 
    }) 
    }) 
.catch(error => { 
    console.error(error); 
}) 

我在'in map'之前得到'here'的輸出。目標是填充數組並通過res.json調用將其發送給客戶端。

我錯過了什麼?

+0

不'Radar.init(radar_id)'返回一個承諾?那麼'Radar.addKpis(radar_id.radar_id,...)'是否會返回一個承諾? –

+0

'Radar.addKpis(radar_id.radar_id,...)'看起來很時髦,更別提在'Promise.all([])' –

回答

3

罪魁禍首是

return Promise.all([ 
    _.map(newRadarIds, (radar_id) =>{ 
    return // a promise 
    }) //end map 
]) 

其中陣列承諾陣列上調用Promise.all。哪些不會被期待。您將希望刪除數組字面並將map的結果 - 承諾數組直接傳遞給Promise.all


還呼籲Promise.all([ … ])與單個元素的數組(Radar.initRadar.addKpis)是相當多餘的(而且可能有害的,如果你不希望得到的結果是一個數組)。只需將then直接鏈接到您的承諾。

最後,您的result將包含undefined條目,因爲您的承諾無法解決任何問題。您需要明確發送RadarNotes。但除了推到陣列更好的滿足與每一個結果你的承諾,使Promise.all可以構建所有結果的數組承諾:

return Promise.all([ 
    Radar.newRadar(1), 
    Radar.newRadar(2), 
    Radar.newRadar(3) 
]) 
.then(newRadarIds => 
    Promise.all(_.map(newRadarIds, radar_id => 
    Radar.init(radar_id) 
    .then(kpi => 
     Radar.addKpis(radar_id.radar_id, ...) 
     .then(radarAddKpi => 
     ({ 
      year : radar_id.year, 
      data : kpi.data 
     }) 
    ) 
    ) 
)) 
) 
.then(result => { 
    res.json(result) 
}) 
.catch (err => { 
    console.error(err); 
}) 
+0

@JaromandaX裏面我只是要評論一下:-)他們不會雖然 – Bergi

+0

是真的,但不會造成意外的執行順序,刪除了評論:p –

+0

清楚,一切!非常感謝 – TLR