Użyj asynchronicznego oczekiwania z tablicą.mapka

Podano następujący kod:

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

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

, który powoduje następujący błąd:

TS2322: Typ "obietnica []" nie jest przypisany do typu " Liczba []". Typ "Promise nie jest przypisany do typu "number".

Jak mogę to naprawić? Jak Mogę sprawić, by async await i Array.map współpracowały ze sobą?
Author: Alon, 2016-10-19

4 answers

Problem polega na tym, że próbujesz await tablicy. To nie robi tego, czego oczekujesz.

Gdy obiekt przekazany do {[1] } nie jest obietnicą, await po prostu zwraca wartość jako-is natychmiast, zamiast próbować ją rozwiązać. Ponieważ przekazałeś await tablicę (obiektów obietnicy) zamiast obietnicy, wartością zwracaną przez wait jest po prostu tablica, która jest typu Promise<number>[].

To co musisz tutaj zrobić to wywołać Promise.all na tablicy zwracanej przez map w celu przekształć ją w jedną obietnicę przed await ing it.

Zgodnie z MDN docs for Promise.all:

Metoda Promise.all(iterable) zwraca obietnicę, która rozwiązuje gdy wszystkie obietnice w argumencie iterable zostaną rozwiązane, lub odrzuca z powodu pierwszej przyjętej obietnicy, która odrzuca.

Więc w Twoim przypadku:

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

To rozwiąże konkretny błąd, który napotkasz tutaj.

 198
Author: Ajedi32,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-06 15:51:29

Jest na to inne rozwiązanie, jeśli nie używasz natywnych obietnic, ale Bluebird.

Możesz też spróbować użyć Promise.map () , mieszając tablicę.mapa i obietnica.wszystkie

W Twoim przypadku:

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

  var results: number[] = await Promise.map(arr, async (item): Promise<number> => {
    await callAsynchronousOperation(item);
    return item + 1;
  });
 8
Author: Gabriel Cheung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 16:45:03

Jeśli mapujesz do tablicy obietnic, możesz następnie rozwiązać je wszystkie na tablicę liczb. Zobacz Obietnica.wszystkie .

 3
Author: Dan Beaulieu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-19 19:52:21

Polecam użycie Promise.wszystko jak wspomniano powyżej, ale jeśli naprawdę masz ochotę uniknąć tego podejścia, możesz wykonać pętlę for lub dowolną inną:

const arr = [1,2,3,4,5];
let resultingArr = [];
for (let i in arr){
  await callAsynchronousOperation(i);
  resultingArr.push(i + 1)
}
 -3
Author: Beckster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-06 06:48:25