我需要在异步函数的return语句之前触发find
的{{1}}的回调函数,但是即使在其中等待,也要在回调函数之前调用return语句面前。
Node.js mongodb 3.1.6
我看到了一些示例,其中使用了async function(myId) {
const myObject = MyObject()
await collection.find({where: {id: myId}}, async (err, results) => {
if (err) {
logger.error('error');
}
myObject.add(results);
});
return myObject
}
模式而不是find(query, callback)
。但这对我而言根本不起作用。我们将find(query).toArray()
与Node.js mongodb 3.1.6
一起使用,也许这与问题有关。
答案 0 :(得分:1)
如果mongo不提供应答功能,请自己做出承诺。创建承诺的包装器或使用它的匿名回调都不应该声明为异步,但是调用者应该...。
function findById(collection, myId) {
return new Promise((resolve, reject) => {
collection.find({where: {id: myId}}, (err, results) => {
(err)? reject(err): resolve(results);
});
});
}
// now callers can use the async await pattern...
async someFunction() {
try {
let myId = // ...
let collection = // ...
let results = await findById(collection, myId);
// do something with results
} catch (err) {
// error
}
}
关键思想是带有回调的collection.find不符合等待条件,因为它不返回承诺。您传递给它的匿名回调函数不是异步函数……只要find回调它,它就会立即起作用。因此,我们围绕mongo构建了一个promise,然后使用带有该promise的新async / await语法。