为什么我的异步功能不起作用?我只是想让它 console.log mongodb 查询的结果?

And*_*rew 4 javascript asynchronous mongodb node.js

我一直在 console.log 上收到 Promise { < pending > } ,我对异步功能一点经验都没有。(使用 JavaScript、Node、Mongodb)

function resolveAfter1() {
  return new Promise(resolve => {
    var scoresFromDb = db.account.find({}, { username: 1, score: 1 }).toArray(function(err, result) {
          if (err) throw err;
          // return result;
    })
    setTimeout(() => {
      resolve('resolved');
    }, 1000);
  });
}

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

asyncCall();

console.log(asyncCall());
Run Code Online (Sandbox Code Playgroud)

Giu*_*ini 5

如果您async从非异步上下文调用函数,则与使用承诺相同。

IE。这个:

async function something() {return 0;}

var result = something();
Run Code Online (Sandbox Code Playgroud)

几乎与此相同:

function something() {
    return new Promise((resolve, reject)=>{resolve(0);});
}

var result = something();
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,result都会是Promise,您可以在控制台中尝试。

这意味着,如果你想得到结果,你需要从async函数中得到:

async function asyncCall() {
  var result = await resolveAfter1();
  console.log(result);
}
Run Code Online (Sandbox Code Playgroud)

要从上下文访问异步结果,您仍然需要使用好的 'ol.then.catch

resolveAfter1()
    .then((result)=>{console.log(result);})
    .catch((error)=>{console.log(error);})
Run Code Online (Sandbox Code Playgroud)

此外,您不应该承诺,这reject是为了:

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);
    });
  });
}
Run Code Online (Sandbox Code Playgroud)