2017-08-16 18 views
0

APIからオブジェクトを取得する約束を返すサービスメソッドを書いています。オブジェクトはAPIの子オブジェクトを取得するためのリンク配列とともに返されます。ここでの重要な点は、すべての子オブジェクトが取得されて親のMyTypeに追加されるまで、外側の約束を解決する必要はないということです。以下は私が望むものに近いですが、返す前に子オブジェクトが解決されるのを待つという約束をどのように得るか分かりません。約束の中で複数の約束を解決する

private getRegistrationDetailsPromise(url: string): Promise<MyType> {  
    return new Promise<MyType>((resolve) => { 
    return this.dataService.GetMyType(url) 
     .then((myType: MyType) => {      
      _.forEach(myType.childReferences, function(childUrl) { 
      let child = this.dataService.GetChild(childUrl).then((child) -> { 
       myType.children.push(child); 
      }; 
     };     
     return (x); 
    }); 
}); 
+2

あなたはすでに約束をしています。 '新しいPromise()'を呼ぶべきではありません。 – SLaks

+0

Promise.all()を使用して約束のループを待っている完成したコードソリューションを提供しようとしていましたが、あなたがしようとしていることの詳細を本当に理解できません。 'new Promise()'で内部の約束事をラップしているときにも、アンチパターンがあります。あなたはそれをする必要もありません。内部の約束を返すだけで、物事を連鎖させ、 'Promise.all()'を使って複数の約束を待つことができます。 – jfriend00

+1

また、なぜES6とES7の時代に人々は依然として可能な配列を反復するのに最も非効率的な方法である '_.forEach()'を使用しているのですか?この場合、おそらく 'myType.childReferences.map()'を使用して、 'Promise.all()'に渡して内部の '.then()'ハンドラから返すことができる子の約束の配列を蓄積するべきです。 – jfriend00

答えて

2

変更.map()_.forEach、およびコールバックからのネストされた約束を返します。
それはあなたに約束を与えるでしょう。

その配列をPromise.all()に渡すと、それらのすべてを待つという約束を得ることができます。

最後に、約束をあなたの約束から戻したいと思うでしょう。

+0

おかげさまで、皆様のご協力をいただきました。これは今私にとって意味がある。また、私はTypescriptで頻繁にコードを作成せず、ES6/ES7の変更に追いついていません。仕事のために他に何かを与えてくれます。それは良いことです。 –

関連する問題