温馨提示:本文翻译自stackoverflow.com,查看原文请点击:javascript - Promises and async/await combination, ideal way to wait for asynchronous operations?
asynchronous javascript node.js

javascript - 承诺和异步/等待组合是等待异步操作的理想方法吗?

发布于 2020-03-27 11:52:10

在函数中具有异步/等待本身将返回“待处理的值”,但是如果使用了承诺,则最终将返回实际值。这是等待异步操作完成的理想方法吗?

这正是我想要的

    var foundForm = await getDocument(query) //Returns the resulting document


 async function getDocument(query){
 return new Promise((resolve,reject) =>{
 MongoClient.connect  (url, async function(err, db) {
if (err) throw err;
 console.log(query)
db.collection("users").find(query).toArray(function(err, result) {
  if (err) {
    console.log(err)
    throw err;
  }
  console.log(result);
  db.close();
  resolve(result) //   returns result;


       });
     });
  })
 }

这不会返回我需要的东西:

      var foundForm = await getDocument(query) //Returns 'pending'


    async function getDocument(query){

      MongoClient.connect  (url, async function(err, db) {
        if (err) throw err;
    console.log(query)
        db.collection("users").find(query).toArray(function(err,                            result) {
    if (err) {
    console.log(err)
    throw err;
  }
  console.log(result);
    db.close();

   return result;
     });

     })

}

查看更多

查看更多

提问者
d12
被浏览
102
T.J. Crowder 2019-07-03 23:29

由于您的getDocument代码需要等待不提供Promise接口的异步操作,getDocument因此不应将其作为async函数,因为您需要手动创建Promise (而且您提供给非承诺函数的回调几乎永远不会是一个async函数。)

function getDocument(query){
    return new Promise((resolve,reject) =>{
        MongoClient.connect(url, function(err, db) {
            if (err) {
                // Reject, don't throw
                reject(err);
                return;
            }
            console.log(query);
            db.collection("users").find(query).toArray(function(err, result) {
                if (err) {
                    // Reject, don't throw
                    reject(err);
                    return;
                }
                console.log(result);
                db.close();
                resolve(result);
            });
        });
    });
}

或者,使用承诺启用的版本MongoClient.connectdb.collection("users").findMongoDB现在在其JavaScript API中提供了这些功能(恐怕我没有详细信息)。然后你会使用async与功能await一些像这样(根据这篇博客文章):

// BE SURE TO DOUBLE-CHECK THE DETAILS
async function getDocument(query){
    const db = await MongoClient.connect(url);
    const await result = db.collection("users").find(query).toArray();
    console.log(result);
    await db.close(); // No idea whether you need `await` here or not
    return result;
}