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