Heim >Web-Frontend >js-Tutorial >Warum schlägt „await arr.map()' fehl und wie kann „Promise.all' das Problem beheben?

Warum schlägt „await arr.map()' fehl und wie kann „Promise.all' das Problem beheben?

DDD
DDDOriginal
2024-12-12 20:52:14137Durchsuche

Why Does `await arr.map()` Fail, and How Can `Promise.all` Fix It?

Grundlegendes zu Async Await und Array.map-Synergie

Im Codeausschnitt:

var arr = [1,2,3,4,5];

var results: number[] = await arr.map(async (item): Promise<number> => {
    await callAsynchronousOperation(item);
    return item + 1;
});

Sie erhalten die Fehlermeldung „TS2322: Geben Sie 'Promise< ;number>[]' kann nicht dem Typ 'number[]' zugewiesen werden. Dieser Fehler weist auf eine Nichtübereinstimmung zwischen dem erwarteten Typ (Nummer[]) und dem tatsächlichen Typ (Promise[]) hin. Um dieses Problem zu lösen, müssen wir verstehen, wie asynchrones Warten und Array.map interagieren.

Das Problem

Das Problem entsteht, weil Sie versuchen, auf ein Array von zu warten Versprechen (Promise[]), was sich vom Warten auf ein einzelnes Versprechen unterscheidet. Wenn „wait“ auf ein Objekt angewendet wird, das kein Promise ist, gibt es den Wert einfach sofort zurück. Da Sie in dieser Situation auf ein Array von Promise-Objekten warten, ist der resultierende Wert das Array selbst (Promise[]).

Die Lösung

Um diesen Fehler zu beheben, können Sie Promise.all verwenden, um das Promise[]-Array in ein einzelnes Promise umzuwandeln. Laut der MDN-Dokumentation wird Promise.all aufgelöst, sobald alle Versprechen innerhalb des iterierbaren Arguments aufgelöst wurden. In Ihrem Code ist das iterierbare Argument das Array von Versprechen, das von arr.map zurückgegeben wird.

Durch die Verwendung von Promise.all wandeln Sie Ihr Array von Versprechen in ein einziges Versprechen um, sodass Sie auf die Auflösung aller Versprechen warten können gleichzeitig.

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;
}));

Erwägen Sie alternativ den Einsatz von Promise.allSettled, Promise.any oder Promise.race, abhängig von Ihrem spezifischen Anwendungsfall. Für das von Ihnen bereitgestellte Szenario bleibt Promise.all jedoch die am besten geeignete Wahl.

Das obige ist der detaillierte Inhalt vonWarum schlägt „await arr.map()' fehl und wie kann „Promise.all' das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn