Разрешить обещание или добавить обратный вызов после метода Array push()

#javascript #ecmascript-6 #es6-promise

#javascript #ecmascript-6 #es6-обещание

Вопрос:

Я использую map () для длинного массива и использую выборку для каждого значения. Для завершения потребуется много секунд. Я хотел бы знать, когда завершится окончательное нажатие, и использовать данные в массиве.

Я пробовал Promise, Promise.all, Async / Await, но, возможно, пропустил что-то очевидное. Я создал этот пример кода, чтобы более просто проиллюстрировать проблему.

 const arr = new Array(100).fill("todos")
const arrPush = []

const result = arr.map(data => {
  fetch(`https://jsonplaceholder.typicode.com/${data}`)
  .then(res => res.json())
  .then(res => arrPush.push(res))
})

Promise.all(result).then(() => console.log(arrPush))  

Когда окончательное значение будет добавлено в массив, сделайте что-нибудь. В данном случае консоль.запишите весь массив.

Ответ №1:

Функция, которую вы передаете map, не имеет оператора return, поэтому result представляет собой массив undefined s. В результате Promise.all нечего ждать.

Кроме того, нет необходимости вручную вставлять в массив. Как только мы добавим оператор return, у вас будет массив обещаний и Promise.все будет преобразовано в массив со всеми материалами, которые вы в данный момент пытаетесь передать.

Итак, попробуйте это:

 const arr = new Array(100).fill("todos")
const promises = arr.map(data => {
  return fetch(`https://jsonplaceholder.typicode.com/${data}`)
    .then(res => res.json());
});

Promise.all(promises)
  .then(arrayOfResults => console.log(arrayOfResults));
  

Комментарии:

1. огромное спасибо! Я знаю, что с этого я начал, но пошел по неверному пути. Я думаю, я предположил, что возврат был ответом, если это имеет смысл.