2017-07-06 19 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); 
}) 

「マップ内」の前に「ここ」という出力が表示されます。目的は配列を塗りつぶしてres.json呼び出しでクライアントに送信することです。

私には何が欠けていますか?

+0

'Radar.init(radar_idは)'約束を返すのですか? 'Radar.addKpis(radar_id.radar_id、...)は約束を返しますか? –

+0

'Radar.addKpis(radar_id.radar_id、...)'はPromise.all([])の中に自分自身のことはもちろん、ファンキーに見えます –

答えて

3

原因は、配列約束ののアレイPromise.allを呼び出し

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

あります。どちらが待たれることはありません。配列リテラルを削除して、map(約束事の配列)の結果を直接Promise.allに渡したいと思うでしょう。 (あなたは結果が配列であることを期待していない場合は、潜在的に有害な)また、単一要素の配列(Radar.initRadar.addKpis)でPromise.all([ … ])を呼び出す


はかなり不必要です。ただあなたが持っている約束に直接thenをチェーンしてください。

最後に、お約束が何も解決されないため、resultundefinedのエントリで構成されます。 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

関連する問題