admin管理员组

文章数量:1410697

i'm trying to understand Promise.all in a map function using async await but i seem to returning promises which are pending, i don't understand why

Here is the working code when i have a .then to resolve my promise

const arr = [1, 2, 3, 4, 5];

const results = Promise.all(arr.map( item => {
    return item + 1;
}));

results.then(result=> console.log(result))

which logs as expected = [ 2, 3, 4, 5, 6 ]

now to implement the function using async-await i know i need to wrap the function in an async function with the keyword async and await for promise.all

const results = async () => await Promise.all(arr.map(async (item) => {
    return item + 1;
}));


console.log(results())

but i always seem to log Promise { <pending> } I don't understand what im doing wrong

i'm trying to understand Promise.all in a map function using async await but i seem to returning promises which are pending, i don't understand why

Here is the working code when i have a .then to resolve my promise

const arr = [1, 2, 3, 4, 5];

const results = Promise.all(arr.map( item => {
    return item + 1;
}));

results.then(result=> console.log(result))

which logs as expected = [ 2, 3, 4, 5, 6 ]

now to implement the function using async-await i know i need to wrap the function in an async function with the keyword async and await for promise.all

const results = async () => await Promise.all(arr.map(async (item) => {
    return item + 1;
}));


console.log(results())

but i always seem to log Promise { <pending> } I don't understand what im doing wrong

Share Improve this question asked May 12, 2019 at 20:40 Ali KhalilAli Khalil 1762 silver badges12 bronze badges 3
  • you cannot use async with map like that. sorry but i'm on phone so.. i might give you a solution tomorrow. i stumbled across this issue before and fixed it – GottZ Commented May 12, 2019 at 20:43
  • 1 You have to await the results console.log(await results()) – Rashomon Commented May 12, 2019 at 20:48
  • you're not actually doing anything asynchronous here, so there should be no need for promises or async/await. But basically the whole purpose of async is to force a function to return a promise, so it can hardly be surprising that its return value is indeed a promise! – Robin Zigmond Commented May 12, 2019 at 20:53
Add a ment  | 

3 Answers 3

Reset to default 5

Using asnyc/await doesn't make the results function synchronous. (It's literally tagged as async!) So it returns a promise, and you have to await that before logging the values:

const arr = [1, 2, 3];

const results = Promise.all(
  arr.map(async item => item + 1)
);

(async () => {
  console.log(await results)
})();

What you are doing is assigning an async function to results, thats not how await for the asynchronous function works. You need to assign a promise to results and to avoid then callback chaining we can use async/await to get the response.

const arr = [1, 2, 3];
const results = Promise.all(arr.map(async (item) => {
    return item + 1;
}));

async function output () { 
  console.log(await results);
}

output();

Like other answers have mentioned, async returns a promise. Thats the reason you are getting

 Promise { <pending> } 

Irrespective of whether what you are doing makes sense, you could just use then on this promise that was returned like so

const results = async () =>
  await Promise.all(
    [1, 2, 3, 4, 5].map(async item => {
      return item + 1;
    })
  );

results().then(e => console.log(e));

本文标签: javascriptasync await promiseall map not resolving promisesStack Overflow