如何在 JavaScript 中 return 一个 'await' 变量?

How to return an 'await' variable in JavaScript?

我有如下JS代码

async function readAtlasAll() {
  return await MongoClient.connect(url, async function(err, db) {
    var dbo = db.db("Users");
    c = dbo.collection("List");
    r = await c.find({}).toArray();
    console.log(r);
    return r;
  });
}

console.log(readAtlasAll());

我不确定为什么,但是打印 readAtlasAll() 的结果先于打印函数内的变量 r,即使我事先正在等待 r 的结果。终端先打印 Promise { <pending> } ,然后打印 r 的内容。 我是 JavaScript 的新手,非常感谢您的帮助。谢谢!

您不能在 MongoDB API 调用中同时使用 await 和普通回调,因为 await 不会做任何有用的事情。使用一个或另一个,而不是两个。这是因为 MongoDB 异步 APIs 将 return 一个承诺,如果你不传递回调给他们然后你可以 await 这个承诺,但如果你传递一个回调,他们没有 return 承诺,因此 await 根本没有任何用处。以下是通过省略回调并使用 await:

来实现它的方法
async function readAtlasAll() {
    const db = await MongoClient.connect(url);
    const dbo = db.db("Users");
    const c = dbo.collection("List");
    const r = await c.find({}).toArray();
    return r;          // this will be the resolved value of the returned promise
}

readAtlasAll().then(r => {
   console.log(r);
}).catch(err => {
    console.log(err);
});

请记住 await 根本没有魔力。它所做的只是暂停函数的执行,直到一个 promise resolves/rejects。因此,只有当您 await 一个承诺时,它才会做任何有用的事情。

此外,所有 async 函数 return 一个承诺,因此没有办法直接从您的函数 return 一个 asynchronously-retrieved 值。您必须使用异步机制来传回异步检索的值,例如承诺、回调或事件。所以 readAtlasAll() 永远无法直接 return 你的价值。

有关详细信息,请参阅 How to return the response from an asynchronous call