333

次のコードがあるとします。

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作業したりできますか?

4

9 に答える 9

735

ここでの問題はawait、Promise ではなく Promise の配列を試みていることです。これはあなたが期待することをしません。

に渡されたオブジェクトがawaitPromise ではない場合await、値を解決しようとする代わりに、そのままの値をすぐに返します。awaitしたがって、Promise の代わりに (Promise オブジェクトの) 配列をここで渡したので、await によって返される値は単にその配列であり、型はPromise<number>[]です。

おそらくやりたいことは、それをing する前に単一の Promise に変換するために、Promise.all返された配列を呼び出すことです。mapawait

のMDNドキュメントにPromise.allよると:

このPromise.all(iterable)メソッドは、 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.racePromise.allPromise.all

于 2016-10-19T20:05:27.833 に答える
29

async await と Array.map を一緒に適切に使用するための以下のソリューション。配列のすべての要素を並行して非同期に処理し、順序を維持します。

const arr = [1, 2, 3, 4, 5, 6, 7, 8];
const randomDelay = () => new Promise(resolve => setTimeout(resolve, Math.random() * 1000));

const calc = async n => {
  await randomDelay();
  return n * 2;
};

const asyncFunc = async () => {
  const unresolvedPromises = arr.map(n => calc(n));
  const results = await Promise.all(unresolvedPromises);
};

asyncFunc();

コードペンも。

Promise.all を「待機」するだけであることに注意してください。「await」なしで calc を複数回呼び出し、未解決の promise の配列をすぐに収集します。次に、 Promise.all はそれらすべての解決を待ち、解決された値を順番に並べた配列を返します。

于 2019-12-24T15:48:43.507 に答える
5

以下を使用できます。

for await (let resolvedPromise of arrayOfPromises) {
  console.log(resolvedPromise)
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of

Promise.all()代わりに使用したい場合はPromise.allSettled() 、拒否された約束をより適切に制御できるようにすることができます。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled

于 2021-01-03T16:13:26.820 に答える