Как вернуть значение из асинхронной функции в array.map в javascript?

#javascript #arrays

#javascript #массивы

Вопрос:

как вернуть значение из асинхронной функции в array.map Я пытаюсь получить доступ к значению из них, но я получаю массив [[object Promise], [object Promise], [object Promise], [object Promise]] ?

Я хочу асинхронность внутри array1.map , потому что у меня есть некоторый процесс, который требует времени, поэтому мне нужно использовать await.

 var array1 = [1, 4, 9, 16];

// pass a function to map
const test = async ()=>{
const map1 = await array1.map(async x => 'hi');

return map1;
// expected output: Array [2, 8, 18, 32]
}
test().then((data)=>{
console.log(data)
})
  

ожидаемый результат: массив ['hi', 'hi', 'hi', 'hi']
мой вывод: [[object Promise], [object Promise], [object Promise], [object Promise]]

Ответ №1:

Вам нужно использовать Promise.all функцию, куда вы помещаете свой массив обещаний

 var array1 = [1, 4, 9, 16];

// pass a function to map
const test = async () => {
  const map1 = await Promise.all(array1.map(async x => 'hi'));
  return map1;
}

test().then((data) => {
  console.log(data)
});  

ожидаемый результат: Array [‘привет’, ‘hi’, ‘hi’, ‘hi’]

Ответ №2:

Решение 1

Если вы поместите await внутри функции map более высокого порядка, вы получите ожидаемый результат

 var array1 = [1, 4, 9, 16];

// pass a function to map
const test = async () => {
  const map1 = await Promise.all(array1.map( async x =>await  'hi'));
  return map1;
}

test().then((data) => {
  console.log(data)
});
  

Решение 2

Если вы удалите async из параметра функции более высокого порядка, вы получите ожидаемый результат.

var array1 = [1, 4, 9, 16];

 // pass a function to map
const test = async () => {
  const map1 = await Promise.all(array1.map( x => 'hi'));
  return map1;
}

test().then((data) => {
  console.log(data)
});
  

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

1. Спасибо, решение 1 работает в моем случае, потому что у меня есть некоторые асинхронные функции внутри array.map.

Ответ №3:

Вы можете использовать async.map из модуля async. функция async.map принимает три аргумента.

  1. Массив для перебора.
  2. Функция, которая должна выполняться для каждого элемента из массива.
  3. Обратный вызов, который будет выполнен после завершения всех итераций.