await 不等待函数结束
await doesn't wait for function to end
我知道很多人都问过这个问题,但我似乎无法使用现有的答案来让我的代码正常工作。我正在尝试使用 mongojs 进行单个查询,然后将结果放入全局(相对于范围)变量以避免嵌套多个回调。但是,我似乎无法获取等待查询结束后再继续的代码。
async function taskmaster() {
const db = mongojs(mongoUri.tasker);
let currentDoc;
const getTask = async function() {
db.tasks.findOne({'task_id': {'$in': [taskId, null]}}, function(err, doc) {
console.log(doc);
currentDoc = doc;
});
}
await getTask();
console.log(currentDoc);
// Code to process currentDoc below
}
无论我做什么,console.log(doc) 显示有效的 MongoDB 文档,而 console.log(currentDoc) 显示“未定义”。提前致谢!
在你的异步函数中,你使用回调风格的 findOne method(),所以 console.log(currentDoc)
显示未定义是完全正常的,因为它在之前执行
currentDoc = doc;
您可以承诺 findOne 方法,将其与 async/await 关键字一起使用。
我在这里找到了一个承诺回调样式函数的教程,希望对您有所帮助:https://flaviocopes.com/node-promisify/
--- 编辑 ---
我按照 O.Jones
的建议,在承诺 findOne 方法时重写了您的代码
async function taskmaster() {
const getTask = async (taskId) => {
return new Promise((resolve, reject) => {
db.tasks.findOne({'task_id': {'$in': [taskId, null]}}, function(err, doc) {
if(err) {
console.log("problem when retrieve data");
reject(err);
} else {
resolve(doc);
}
});
})
const db = mongojs(mongoUri.tasker);
const currentDoc = await getTask(taskId);
console.log(currentDoc);
}
我知道很多人都问过这个问题,但我似乎无法使用现有的答案来让我的代码正常工作。我正在尝试使用 mongojs 进行单个查询,然后将结果放入全局(相对于范围)变量以避免嵌套多个回调。但是,我似乎无法获取等待查询结束后再继续的代码。
async function taskmaster() {
const db = mongojs(mongoUri.tasker);
let currentDoc;
const getTask = async function() {
db.tasks.findOne({'task_id': {'$in': [taskId, null]}}, function(err, doc) {
console.log(doc);
currentDoc = doc;
});
}
await getTask();
console.log(currentDoc);
// Code to process currentDoc below
}
无论我做什么,console.log(doc) 显示有效的 MongoDB 文档,而 console.log(currentDoc) 显示“未定义”。提前致谢!
在你的异步函数中,你使用回调风格的 findOne method(),所以 console.log(currentDoc)
显示未定义是完全正常的,因为它在之前执行
currentDoc = doc;
您可以承诺 findOne 方法,将其与 async/await 关键字一起使用。
我在这里找到了一个承诺回调样式函数的教程,希望对您有所帮助:https://flaviocopes.com/node-promisify/
--- 编辑 ---
我按照 O.Jones
的建议,在承诺 findOne 方法时重写了您的代码async function taskmaster() {
const getTask = async (taskId) => {
return new Promise((resolve, reject) => {
db.tasks.findOne({'task_id': {'$in': [taskId, null]}}, function(err, doc) {
if(err) {
console.log("problem when retrieve data");
reject(err);
} else {
resolve(doc);
}
});
})
const db = mongojs(mongoUri.tasker);
const currentDoc = await getTask(taskId);
console.log(currentDoc);
}