5

私はいくつかのTypescriptメソッドを構築するために、しばしば私は約束の非同期性を必要としますが、概念的に言えば値を返すという約束は必要ありません。アプリケーションが使用する言語文字列をロードするためのinitLanguageStrings()メソッドを呼び出す単純な例があります。言語ストリングはグローバル構造に配置されますが、アプリケーションが言語ストリングがロードされるまで続行されないようにするためには、引き続き約束が必要です。TypeScript内のPromise の結果タイプを変更する方法

複数回このシナリオを2回または3回実行して、すべての初期化作業を一連の約束事に結びつけ、すべてを完了してから続行する必要があります。 Iしたがって、そう(例えば)のような、Promise.allを使用する:

initialiseApp(): Promise<void> 
{ 
    let promises: Promise<any>[ ] = [ ]; 

    promises.push(this.initLanguageStrings()); 
    promises.push(this.initModelData()); 
    promises.push(this.initUserInfo()); 

    return Promise.all(promises); 
} 

Promise.all()戻り任意[]>約束しない<を約束するので、上記のコードは、実際に(TS1.5/1.6)コンパイルされません< void>。

は、だから私は書き込みを終わる何これです:

return new Promise((resolve, reject) => { 
    Promise.all(promises) 
     .then((dummy: any[ ]) => { 
     resolve(); 
     });   
}); 

「実装」は、実際に隠されたままで、ので、私は、これは意味的に正しいアプローチであると考えている「内部の約束」(Promise.allから) initialiseApp()の呼び出し側に決して「エスケープ」しません。

しかし、私はこのアプローチが醜いと感じています。返すPromise < void>が私にとって非常に一般的なパターンになっているので、これを行うにはより良い方法を見つけたいと思います。

私がしようとしていることを達成するためのより良い方法はありますか?

return Promise.all(promises).then(() => { }); 

をしかし、それはあまりにも「トリッキー」と醜いとして私を打つ:

コンパイラが許可されます。

答えて

3

空約束<を返す以来、>私のために

非常に一般的なパターンになってきているあなたは

initialiseApp(): Promise<void> 
{ 
    let promises: Promise<any>[ ] = [ ]; 

    promises.push(this.initLanguageStrings()); 
    promises.push(this.initModelData()); 
    promises.push(this.initUserInfo()); 

    return Promise.all(promises) as Promise<void>; 
} 

型アサーションを使用することができます注:アサーションを使用するときは、基本的にありますこの場合はがコンパイラに横たわっています。コンパイラが1つのことを考えるバグとランタイムが別のものを見るバグには注意してください。

return Promise.all(promises).then(() => { });

これはそれを行うには権利方法です。 ランタイムは、コンパイラがを推測したものと一致すると一致します。 Promise<void>が必要な場合は、Promise<void>にしてください。これはこのコードサンプルの機能です。

+0

キャスト(型アサーション)を使用することの欠点は、コンパイラに横たわっているだけでなく、関数の呼び出し元への結果が「出る」ということです。言い換えれば、initialiseAppの呼び出し元は実際にPromiseからany []を受け取ります。方法は返されるべきではないと言っているにもかかわらず、すべて。 – Kevmeister68

関連する問題