1. ホーム
  2. ジャバスクリプト

[解決済み】Array.mapで非同期awaitを使用する。

2022-03-27 10:19:02

質問

次のようなコードがあるとする。

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 awaitArray.map は一緒に働くのですか?

解決方法は?

ここで問題なのは、あなたが await はプロミスではなく、プロミスの配列です。これはあなたが期待することを行いません。

に渡されたオブジェクトが await がPromiseでない場合。 await は、解決しようとせず、単に値をそのまま即座に返します。つまり await の配列であるため、await が返す値は単純にその配列であり、型は Promise<number>[] .

おそらく、あなたがしたいことは Promise.all が返す配列に対して map の前に、単一のPromiseに変換するためです。 await である。

によると の MDN ドキュメントを参照してください。 Promise.all :

Promise.all(iterable) メソッドは、次のように解決するプロミスを返します。 引数iterableに含まれる全ての約束が解決したとき、または は、最初に渡されたプロミスが拒否された理由とともに拒否します。

つまり、あなたの場合

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 を指定します。