【问题标题】:await doesn't wait for function to endawait 不等待函数结束
【发布时间】:2021-04-06 02:04:43
【问题描述】:

我知道这个问题已经被问了很多,但我似乎无法使用现有的答案来让我的代码正常工作。我正在尝试使用 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) 显示“未定义”。提前致谢!

【问题讨论】:

    标签: node.js asynchronous mongojs


    【解决方案1】:

    在您的异步函数中,您使用回调样式的 findOne 方法(),所以 console.log(currentDoc) 显示未定义是完全正常的,因为它在之前执行 currentDoc = doc;

    您可以承诺 findOne 方法,将其与 async/await 关键字一起使用。

    我在这里找到了一个 promisfy 回调样式函数的教程,希望对您有所帮助: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);
    }
    

    【讨论】:

    • 欢迎来到 Stack Overflow。好答案。我希望我们将来会看到您的更多贡献。
    • 我错过了函数中的async关键字,应该是const getTask = async (taskId) => {。我编辑了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 2018-01-17
    • 2019-01-06
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多