Не удалось получить возвращаемое значение обещания [дублировать]

sorted(yourdata, reverse=True)
83
задан Alon 26 July 2017 в 07:32
поделиться

4 ответа

Проблема в том, что вы пытаетесь await массива. Это не делает то, что вы ожидаете.

Когда объект, переданный в await, не является Promise, await просто возвращает значение as-is немедленно, а не пытается его решить. Так как вы передали await массив (объектов Promise) здесь вместо Promise, значение, возвращаемое await, - это просто массив, который имеет тип Promise<number>[].

Что вам нужно сделать здесь вызывается Promise.all в массиве, возвращаемом map, чтобы преобразовать его в одно обещание до await.

Согласно документам MDN для Promise.all :

Метод 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;
}));

Это решит конкретную ошибку, с которой вы сталкиваетесь здесь.

177
ответ дан Ajedi32 15 August 2018 в 23:50
поделиться

Есть еще одно решение, если вы не используете собственные обещания, но 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;
  });
6
ответ дан Bojan Markovic 15 August 2018 в 23:50
поделиться
  • 1
    Это другое - он не выполняет все операции параллельно, а выполняет их последовательно. – Andrey Tserkus 15 November 2017 в 04:02
  • 2
    @AndreyTserkus Promise.mapSeries или Promise.each являются последовательными, Promise.map начинает все сразу. – Kiechlus 30 November 2017 в 16:46
  • 3
    @AndreyTserkus вы можете запускать все или некоторые операции параллельно, предоставляя опцию concurrency. – Mateusz Rzepa 18 January 2018 в 22:26
  • 4
    Стоит отметить, что это не ванильный JS. – Michal 24 February 2018 в 14:46

Если вы сопоставляете массив обещаний, вы можете разрешить их все в массив чисел. См. Promise.all .

3
ответ дан Dan Beaulieu 15 August 2018 в 23:50
поделиться

Я бы рекомендовал использовать Promise.all, как упоминалось выше, но если вам действительно нравится избегать этого подхода, вы можете сделать для или любого другого цикла:

const arr = [1,2,3,4,5];
let resultingArr = [];
for (let i in arr){
  await callAsynchronousOperation(i);
  resultingArr.push(i + 1)
}
-2
ответ дан evandrix 15 August 2018 в 23:50
поделиться
  • 1
    Promise.all будет асинхронным для каждого элемента массива. Это будет синхронизация, она должна подождать, чтобы закончить один элемент, чтобы начать следующий. – Santiago Mendoza Ramirez 1 March 2018 в 16:38
Другие вопросы по тегам:

Похожие вопросы: