[英]Mixing asynchronous and synchronous work with async/await and/or promises in javascript
[英]Promises and async/await combination, ideal way to wait for asynchronous operations?
在函数中单独具有async / await会返回“待处理的值”,但是如果使用了promise,则最终将返回实际值。 这是等待异步操作完成的理想方法吗?
这正是我想要的
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;
});
})
}
由于您的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.connect
和db.collection("users").find
。 MongoDB现在在其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;
}
简而言之,是的。 如果您要针对支持es6 async / await的平台并希望利用该平台,那么如果库仅公开了一个回调API,然后将其“包装”在Promise(您的第一个函数)中,便是您的实现方式。 尽管您首先要确保该库不提供基于Promise的api,但是您可以从该库中返回Promise并等待它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.