2016-05-06 27 views
2

これはネストされた約束事の私の最初のショットです。私はbluebirdライブラリを使用していますが、このアイデアはすべての約束ライブラリにとって同じだと思います。親の約束の中から約束事を解決する

ハイレベルで

、これは私がやろうとしているものです:

myService.getSomeData(url) 
.then((data) => { 
    myOtherService.getMoreData(data.uniqueId) 
    .then((thisDataIsAnArray) => { 
     //loop over the data above and do something 
    }); 
}); 

getMoreData()はXサービス呼び出しを行うと長い配列Xの要素に結果を格納することになっています。これは私が迷子になり始めるところです。私はこの方法を工夫する方法がわからず、私はそこから戻るべきです。私はブルーバードのPromise.allPromise.mapでいくつかの刺し傷を取ったが、鞭打っていて、私は提案を求めていると思った。

+0

あなたの目標を理解しようとしています。だから、一連の約束を実行し、最初の約束の決議が与えられた別の約束を実行し、次に約束の第2セットの決議に基づいて第3の論理を実行したいとしますか? 約束の目標の1つは、「コールバック地獄」を削除することです。結果として、それらを入れ子にするのではなく、約束を繋ぐことはあなたにとって良いことかもしれません。 – jpodwys

+3

[チェーンを平らにする](http://stackoverflow.com/a/22000931/1048572)から始めたいと思うかもしれません。 – Bergi

+1

すべての非同期メソッドは、内部の非同期アクションの結果に対して* promise *を返す必要があります。すべて1つ1つ。 – Bergi

答えて

3

Return all the promises!

約束ではなく、関数にコールバックを渡すのあなたにコールバックを添付だけの戻り値です。それらのすべてを返さない限り、コールバックが連鎖したり、すべてのエラーをキャッチする方法はありません。

また、.thenさんから別の約束があった瞬間から戻ってきます。これは物事を平らげます。

2

初めての試みでも私の脳は完全に反りました。私はBluebirdのドキュメントは、一般的な使用事例を区別するのはかなり貧弱な仕事だと思うが、(a)私はBluebirdが好きで、(b)私はドキュメントを更新する時間がないので、

Promise.mapがあなたのシナリオに適しているような気がします。あなたは私があなたにも.reduce、または.eachを使用することができます.map使用してきた結果、と何をしたいのかに応じて、

myService.getSomeData(url) 
    .then((data) => 
    { 
     return myOtherService.getMoreData(data.uniqueId) 
    }) 
    .map((item) => 
    { 
     return doSomethingWithData(item); 
    }) 
    .then((results) => 
    { 
     // do something with the result array. 
    }); 

.eachは、それがチェーンされている約束からの戻り値を変更しないことに注意してください。したがって、Bluebirdドキュメントの「副作用のみを使用する」コメントです。

インスタンスと静的メソッドの違いは、静的では配列を指定する必要があります。 Promise.map(array, (item) => {})

また、@ jibが述べたように、常にコールバック内の値を返します。これにより、多くの痛みが軽減されます。

+0

この例をありがとう。この例では、 'doSomethingWithData()'が約束を返す必要があると思われます。もしそうでなければ、例えば2という数字だけを返しますか?私はそれを 'Promise.promisify'やそれに沿ったもので包むべきでしょうか? – jkj2000

+0

@ jkj2000 'doSomethingWithData(item)'が非同期の場合、約束を返すことになります。署名が実際に 'doSomethingWithData(item、callback)'である場合、 'Promise.promisify'は良いアイデアです。それともまだ実装されていれば、最初から約束ベースの実装を検討してください。 一般的に、約束を返す必要はありません。値は大丈夫です。約束の値と約束していない値が混在しています。 –