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:
Jak mogę to naprawić? Jak Mogę sprawić, byTS2322: Typ "obietnica []" nie jest przypisany do typu " Liczba []". Typ "Promise
nie jest przypisany do typu "number".
async await
i Array.map
współpracowały ze sobą? 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.
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.wszystkieW 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;
});
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 .
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)
}
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