Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Promises和async/wait的组合,是等待异步操作的理想方式吗?_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript Promises和async/wait的组合,是等待异步操作的理想方式吗?

Javascript Promises和async/wait的组合,是等待异步操作的理想方式吗?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,在函数中单独使用async/await将返回一个“挂起的值”,但如果使用了承诺,那么最终将返回实际值。这是等待异步操作完成的理想方式吗 这正是我想要的 这不会返回我需要的: }由于您的getDocument代码需要等待不提供承诺接口的异步操作,getDocument不应该是async函数,因为您需要手动创建承诺。(您给非承诺聚焦函数的回调几乎不应该是async函数。) 或者,使用启用承诺的MongoClient.connect和db.collection(“用户”).find版本。MongoDB

在函数中单独使用async/await将返回一个“挂起的值”,但如果使用了承诺,那么最终将返回实际值。这是等待异步操作完成的理想方式吗

这正是我想要的

这不会返回我需要的:


}由于您的
getDocument
代码需要等待不提供承诺接口的异步操作,
getDocument
不应该是
async
函数,因为您需要手动创建承诺。(您给非承诺聚焦函数的回调几乎不应该是
async
函数。)

或者,使用启用承诺的
MongoClient.connect
db.collection(“用户”).find版本。MongoDB现在在其JavaScript API中提供了这些功能(我恐怕没有详细信息)。然后将
异步
函数与
等待
类似的东西一起使用(根据):


由于您的
getDocument
代码需要等待不提供承诺接口的异步操作,
getDocument
不应该是
async
函数,因为您需要手动创建承诺。(您给非承诺聚焦函数的回调几乎不应该是
async
函数。)

或者,使用启用承诺的
MongoClient.connect
db.collection(“用户”).find版本。MongoDB现在在其JavaScript API中提供了这些功能(我恐怕没有详细信息)。然后将
异步
函数与
等待
类似的东西一起使用(根据):


简言之,是的。如果您的目标是支持es6 async/await的平台,并且希望利用它,那么如果库只公开回调api,那么将回调“包装”到Promise(您的第一个函数)中就是实现这一点的方法。尽管您首先希望确保库不提供基于承诺的api,但您可以从库中返回承诺并等待。

简而言之,是的。如果您的目标是支持es6 async/await的平台,并且希望利用它,那么如果库只公开回调api,那么将回调“包装”到Promise(您的第一个函数)中就是实现这一点的方法。尽管您首先希望确保库不提供基于承诺的api,但是您可以从库中返回承诺并等待。

您可以用它来澄清一下您的代码示例吗。此外,在我看来,您的内部MongoClient.connect回调不需要
async
,因为您不需要等待任何东西。我敢说,没有理想的方法来处理它,async/await是承诺实现的语法糖,只是处理了一些人们不喜欢的承诺链的东西。在第二段代码中得到的挂起,仅仅是因为您没有解析或拒绝,所以它们是编写该段代码时的错误。第一个函数立即返回解析为回调结果的承诺,第二个函数不返回任何内容,
返回结果正在从回调返回,而不是
getDocument()
function@WilliamLohan当然这很有意义,现在你可以用它来澄清你的代码样本了。此外,在我看来,您的内部MongoClient.connect回调不需要
async
,因为您不需要等待任何东西。我敢说,没有理想的方法来处理它,async/await是承诺实现的语法糖,只是处理了一些人们不喜欢的承诺链的东西。在第二段代码中得到的挂起,仅仅是因为您没有解析或拒绝,所以它们是编写该段代码时的错误。第一个函数立即返回解析为回调结果的承诺,第二个函数不返回任何内容,
返回结果正在从回调返回,而不是
getDocument()
function@WilliamLohan当然这一点现在非常有意义(并且您给非承诺聚焦函数的回调几乎永远不应该是异步函数。)-为什么这被认为是不好的?这会带来什么后果?而且MongoDB javascript API片段看起来干净而新鲜,awesome@d12-因为
async
函数总是返回一个承诺,但如果它们返回该承诺的对象与该承诺没有任何关系,则会设置未处理的拒绝错误。它也会误导你(和你潜在的读者),给人一种印象,即你兑现承诺的东西会用它做一些有用的事情。一个典型的例子是,人们在数组上使用
forEach
并传入一个
async
回调,然后想知道为什么在第一个数组完成工作之前,所有数组项都要经过
forEach
。:-)太棒了,这现在有意义了!(而您给一个非承诺聚焦函数的回调几乎永远不应该是一个异步函数。)-为什么这被认为是不好的?这会带来什么后果?而且MongoDB javascript API片段看起来干净而新鲜,awesome@d12-因为
async
函数总是返回一个承诺,但如果它们返回该承诺的对象与该承诺没有任何关系,则会设置未处理的拒绝错误。它也会误导你(和你潜在的读者),给人一种印象,即你兑现承诺的东西会用它做一些有用的事情。一个典型的例子是,人们在数组上使用
forEach
,并传入
async
回调,然后想知道为什么所有数组项都是pas
    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;
     });

     })
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);
            });
        });
    });
}
// 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;
}