次のコードがあるとします:
var arr = [1,2,3,4,5];
var results: number[] = await arr.map(async (item): Promise<number> => {
await callAsynchronousOperation(item);
return item + 1;
});
次のエラーが発生します。
TS2322: 型 'Promise<number>[]' は型 'number[]' に割り当てることができません。 型 'Promise<number> は型 'number' に割り当てることができません。
どうすれば解決できるでしょうか? どうすれば協力しasync await
てArray.map
作業できるでしょうか?
ベストアンサー1
ここでの問題は、await
Promise ではなく、Promise の配列を試みていることです。これは期待どおりには動作しません。
渡されたオブジェクトがawait
Promise でない場合は、await
解決を試みることなく、値をそのまますぐに返します。したがって、await
ここでは Promise ではなく配列 (Promise オブジェクトの配列) を渡したので、await によって返される値は単にその配列 (型) になりますPromise<number>[]
。
おそらく、Promise.all
によって返された配列を呼び出して、それを ing するmap
前に単一の Promise に変換することになるでしょうawait
。
この
Promise.all(iterable)
メソッドは、反復可能な引数内のすべての Promise が解決されたときに解決する Promise を返すか、最初に渡された Promise が拒否された理由によって拒否します。
あなたの場合は次のようになります:
var arr = [1, 2, 3, 4, 5];
var results: number[] = await Promise.all(arr.map(async (item): Promise<number> => {
await callAsynchronousOperation(item);
return item + 1;
}));
これにより、ここで発生している特定のエラーが解決されます。
何をしようとしているかに応じて、次の方法も検討してください。Promise.allSettled
、Promise.any
、 またはPromise.race
の代わりに を使用しますPromise.all
が、ほとんどの場合 (この場合もほぼ間違いなく) は を使用するPromise.all
のが望ましいでしょう。