2017-03-22 6 views
1

に次のハンドラに値を渡すために活字体でPromise.allを使用すると、時々そうのような非同期処理のチェーンにおけるデータの再利用一部のビットにPromise.allを使用することが有用である:缶にJavaScriptではチェーン

logMeIn() 
.then(token => { 
    return Promise.all([ 
    token, 
    fetchProfile(token) 
    ]) 
}) 
.then(([token, profile]) => { 
    return getAvatar(token, {userId: profile.id}) 
}) 
// etc... 

わかりましたが、2番目のthenリゾルバは最初のリゾルバの結果を必要としますが、依然としてtokenが必要です。 1つ目の方法は、2番目のthenコールを最初に入れ子にすることですが、これは醜いことがあり、長いチェーンでは、コールバック・ヘルが緩和するように設計されていると約束します。

Promise.all()を使用すると、以前のリゾルバからのデータを再利用し、チェーンに渡すことができます。

このすべてが素晴らしい作品が、あなたがしようとすると、このようなエラーでこれを行う際に活字体がフリップアウト:

型の引数「(文字列|約束<サムシング>)[]」パラメータに 割り当てられませんタイプ 'IterableShim <の何か| PromiseLike <何か> > 'です。プロパティの型 '"es6-shim iterator"' は互換性がありません。
タイプ '()= > IterableIteratorShim <文字列|プロミス<何か> > 'はタイプ'()= >に割り当てられませんイテレータ<何か| PromiseLike <何か> > 'です。

型の安全性を保ちながら、上記を実行できる方法がありますか?

+0

お知らせをその一般的な問題のために、[他の多くのソリューション](http://stackoverflow.com/q/28250680/1048572)があります。 TypeScriptはすでに 'async' /' await'をサポートしていませんか? – Bergi

+0

@Bergiこれは、TypeScriptが[variadic types](https://github.com/Microsoft/TypeScript/issues/5453)を取得したときにこの特定のパターンがサポートされる可能性がありますが、 –

答えて

0

あなたは明示的に戻り値の型を指定しようとすることができます

logMeIn() 
    .then<[Token, Profile]>(token => Promise.all([token, fetchProfile(token)])) 
    .then(([token, profile]) => getAvatar(token, { userId: profile.id })) 
関連する問題