Andrew
Andrew

Reputation: 705

Promise { <pending> } ' why is it still pending?' How can I fix this?

So the result in the console shows as -

Promise { <pending> } ' why is it still pending?'
[ { _id: 5a7c6552380e0a299fa752d3, username: 'test', score: 44 } ]

So it tells me Promise { pending } but then follows with the answer that I wanted to see which is -

[ { _id: 5a7c6552380e0a299fa752d3, username: 'test', score: 44 } ]

but how can I fix that promise pending section, it's a console.log that I run at the bottom of the code.

function resolveAfter1() {
  return new Promise((resolve, reject) => {
    var scoresFromDb = db.account.find({}, { username: 1, score: 1 }).toArray(function(err, result) {
          if (err) 
              reject(err);
          else
              resolve(result);
    });
  });
}

resolveAfter1() // resolve function
    .then((result)=>{console.log(result);})
    .catch((error)=>{console.log(error);})

    async function asyncCall() {
      var result = await resolveAfter1();
      // console.log(result);
    }

    console.log(asyncCall(), ' why is it still pending?');

Upvotes: 4

Views: 13866

Answers (2)

Daniel Conde Marin
Daniel Conde Marin

Reputation: 7742

Replace:

console.log(asyncCall(), ' why is it still pending?');

With:

async function run() {
   console.log(await asyncCall());
}

run();

You were printing the result of asyncCall which is an async function. Async functions wrap their returned result in a Promise, and if you want the actual value which the promise resolved to, you have to use await someAsyncFunc().

Put in a simple example:

async function asyncCall() {
   return 1;
}

async function run() {
   console.log(asyncCall()); // this doesn't wait for the Promise to resolve
   console.log(await asyncCall()); // this does
}

run();

Upvotes: 4

yue you
yue you

Reputation: 2264

Because you are console.log a AsyncFunction directly without await, it will return you a unresolved Promise object

function resolveAfter1() {
  return new Promise((resolve, reject) => {
    setTimeout(resolve('a'), 100)
  })
}

async function asyncCall() {
  var result = await resolveAfter1();
  return result
}

(async () => {
  console.log(await asyncCall(), ' It is not pending anymore!!!!')
})()

Upvotes: 0

Related Questions