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

时间:2018-02-09 11:30:56

标签: javascript node.js mongodb asynchronous

我一直在接受Promise {<待定>在console.log上,我对Async函数一点都不太熟悉。 (使用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());

2 个答案:

答案 0 :(得分:3)

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

IE。这样:

async function something() {return 0;}

var result = something();

几乎与此相同:

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

var result = something();

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

这意味着,如果您想获得结果,则需要从async函数执行此操作:

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

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

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

此外,你不应该承诺,这是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);
    });
  });
}

答案 1 :(得分:0)

foo