4

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?');
Andrew
  • 695
  • 2
  • 9
  • 25
  • 1
    Because you don't wait for `asyncCall` with `await`. – lolbas Feb 09 '18 at 14:55
  • What do you recommend, I should use instead? – Andrew Feb 09 '18 at 14:56
  • @Andrew First port of call ► [**async function**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function) && [**await**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await) || [**How to “await” for a callback to return?**](https://stackoverflow.com/questions/37104199/how-to-await-for-a-callback-to-return) – Nope Feb 09 '18 at 14:58

2 Answers2

4

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();
Daniel Conde Marin
  • 7,588
  • 4
  • 35
  • 44
0

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!!!!')
})()
yue you
  • 2,206
  • 1
  • 12
  • 29