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