2017-11-07 7 views
1

私はpromise.allを非同期で待っていることを望むいくつかの約束機能を持っています。しかし、私はそれらのいずれかに 'then'チェーンがあるときにそれを行う方法がわかりません。async promise.all with chain

たとえば、

Promise.all([ 
    promiseFn1(), 
    promiseFn2().then(promiseFn3) 
]) 

にはどうすればpromiseFn2()Promise.allの内側にチェーンされたときに待つ非同期実装するのでしょうか?私はannoynmous機能させることを考えていますが、希望

ないように:

await Promise.all([ 
    promise1.fn(), 
    (() =>{ 
     p2response = await promise2Fn(); 
     return promise3Fn(p2response); 
    })() 
]) 
+0

'Promise.all([ promiseFn1()、 promiseFn3(promiseFn2()を待つ) ]'? –

+0

'promiseFn3()'を 'promiseFn2()'の中の 'then()'に移動します。 –

+0

@PatrickRobertsいいえ、[処理されなかった拒否につながる可能性があります](https://stackoverflow.com/questions/46889290/waiting-for-more) -than-one-concurrent-await-operation) – Bergi

答えて

3

はい、すぐに実行これを行うことができasync関数式:私は推薦するしかし

await Promise.all([ 
    promise1.fn(), 
    (async() => promise3Fn(await promise2Fn()))() 
]) 

をはるかにシンプルな.then()コールでお待ちください。 awaitどこにでも使用するようなものではない...

また、クリーンコード(例:thenチェーンはあなたの例のように単純ではありませんが、関数式を含む)を探している場合は、名前付きヘルパー関数:あなたが同時にawaitを使用したいときに、関数内の実行が常にシーケンシャルであるよう

async function promise2and3fn() { 
    return promise3Fn(await promise2Fn()); 
} 
await Promise.all([ 
    promise1.fn(), 
    promise2and3fn() 
]) 

、これらの追加機能の周りに方法はありません。

+0

私が同意すると、 '.then()'呼び出しは他のナンセンスよりも読みやすくなります。 –

+0

私の例ではpromise2&3が大幅に簡略化されているので、それを書くきれいな方法があるのだろうかと思っていました。それを単に関数として指定する必要があります。タイ –