异步/等待未按预期顺序执行

时间:2018-08-12 15:29:49

标签: javascript node.js mongodb async-await

我目前正在尝试学习Java语言中的MongoDB和异步函数,并且在过去的几个小时里一直走运不顺利。

async function getObj(name) {
  var db = await mongo.connect(DBURL, {
    useNewUrlParser: true
  });

  var dbo = db.db("testdb");

  var meme;

  await dbo.collection("files").findOne({
    "_id": name
  }, function(err, res) {
    console.log(res + " a");
    meme = res;
    console.log(meme + " b");
  });

  console.log(meme + " c");
  await db.close();
  console.log(meme + " d");
  return meme;
}

程序按以下顺序打印: C d 一种 b

如果我执行console.log(res),则该查询工作正常,可以得到具有正确结果的对象,所以这不是问题。

为什么程序会忽略之前的等待并最终打印并返回未定义的内容?

1 个答案:

答案 0 :(得分:3)

您未使用将await与回调一起使用时可以db.findOne的承诺。您应该像这样等待它:

async function getObj(name) {
  var db = await mongo.connect(DBURL, {
    useNewUrlParser: true
  });

  var dbo = db.db("testdb");

  var meme = await dbo.collection("files").findOne({
    "_id": name
  });

  console.log(meme + " c");
  await db.close();
  console.log(meme + " d");
  return meme;
}