Проблема в том, что вы пытаетесь await
массива. Это не делает то, что вы ожидаете.
Когда объект, переданный в await
, не является Promise, await
просто возвращает значение as-is немедленно, а не пытается его решить. Так как вы передали await
массив (объектов Promise) здесь вместо Promise, значение, возвращаемое await, - это просто массив, который имеет тип Promise<number>[]
.
Что вам нужно сделать здесь вызывается Promise.all
в массиве, возвращаемом map
, чтобы преобразовать его в одно обещание до await
.
Согласно документам MDN для Promise.all
:
Метод
blockquote>Promise.all(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; }));
Это решит конкретную ошибку, с которой вы сталкиваетесь здесь.
Есть еще одно решение, если вы не используете собственные обещания, но Bluebird.
Вы также можете попробовать использовать Promise.map () , смешивая array.map и Promise.all
. В вашем случае:
var arr = [1,2,3,4,5];
var results: number[] = await Promise.map(arr, async (item): Promise<number> => {
await callAsynchronousOperation(item);
return item + 1;
});
Promise.mapSeries
или Promise.each
являются последовательными, Promise.map
начинает все сразу.
– Kiechlus
30 November 2017 в 16:46
concurrency
.
– Mateusz Rzepa
18 January 2018 в 22:26
Если вы сопоставляете массив обещаний, вы можете разрешить их все в массив чисел. См. Promise.all .
Я бы рекомендовал использовать Promise.all, как упоминалось выше, но если вам действительно нравится избегать этого подхода, вы можете сделать для или любого другого цикла:
const arr = [1,2,3,4,5];
let resultingArr = [];
for (let i in arr){
await callAsynchronousOperation(i);
resultingArr.push(i + 1)
}
:
? – Daniel Pendergast 13 October 2017 в 23:20