【问题标题】:async/await functions not executing in the correct orderasync/await 函数未按正确顺序执行
【发布时间】:2019-07-01 12:07:12
【问题描述】:

我有一系列 async/await 函数,但它们的执行顺序似乎表明 await 语句没有阻止执行。我正在使用 Twilio 和 Sequelize,但我想可以在不了解这两个包的任何一个的情况下诊断异步问题。很抱歉发布了这么多代码,但我觉得我需要包含所有代码来解释问题。

我的主要代码是:

app.post('/sms',async function(req,res){
    try{
        worker=await worker.updateWorker('+18005559999',process.env.TWILIO_OFFLINE_SID);
        responseValue="/sms: worker "+worker.friendlyName+" updated to: "+worker.activityName;
        console.log(responseValue);
        res.status(200).send();

    }
    catch(err){
        console.log("/sms error: "+err);
    }
}

worker.updateWorker() 在 ES6 类中定义如下:

async updateWorker(contact_uri,activitySid){
        console.log("updateWorker: getting workerSid from database");
        workerSid=await database.getWorkerSid(contact_uri);
        console.log("updateWorker: workerSid is "+workerSid);
        worker=await this.updateWorkerFromSid(workerSid,activitySid);
        console.log("updateWorker: worker's friendlyName is "+worker.friendlyName);
        return worker;
    }

database.getWorkerSid() 是:

getWorkerSid(contact_uri){
        return new Promise(function(resolve,reject){
            sequelize.query("select * from worker where contact_uri='"+contact_uri+"'",
            { type: sequelize.QueryTypes.SELECT})
            .then(result=>{
                if(result.length==0){
                    resolve(null);
                }
                else{
                    resolve(result[0].sid);
                }
            })
            .catch(err=>reject(err));
        });
    }

this.updateWorkerFromSid() 是:

async updateWorkerFromSid(workerSid,activitySid){
        var worker;
        try{
            worker=await this.workspace.workers(workerSid)
                        .update({
                            activitySid:activitySid
                        });
            console.log("updateWorkerFromSid: worker has been updated to activity: "+worker.activityName);
            return worker;
        }
        catch(err){
            console.log("updateWorkerFromSid error: "+err);
        }
        finally{
            return worker;
        }

    }

我最终在控制台中得到的是:

updateWorker: getting workerSid from database
Executing (default): select * from worker where contact_uri='+18005559999'
/sms error: ReferenceError: workerSid is not defined

所以这让我觉得我们已经到了database.getWorkerSid() 中的sequelize.query() 调用,但是随后执行继续进行而不等待查询承诺解决,并且就行了:

console.log("updateWorker: workerSid is "+workerSid);

workerSid 未定义,因此会发生崩溃,并且错误会传播回主代码中的 try/catch 块。

基本上,我想做的是:

  1. 根据contact_uri从数据库中获取workerSid
  2. 使用workerSid更新worker
  3. 更新完成后,将有关更新的信息输出到控制台

我应该如何设置我的 async/await 以确保事件按此顺序发生?

【问题讨论】:

  • 您没有忘记getWorkerSid 中的async 关键字吗?这是我唯一能想到的。除此之外,您的代码看起来不错,并且您确保承诺所有需要的东西。
  • 请控制台 getWorkerSid 函数的结果并更新您的问题。
  • 您将需要使用let/const/var 将您的变量声明为本地变量!

标签: node.js promise async-await twilio sequelize.js


【解决方案1】:

我重构了database.getWorkerSid(),去掉了Promise构造函数反模式,如下:

async getWorkerSid(contact_uri){
        var workerRow=await this.getRowFromWorkerTable(contact_uri);
        if (workerRow.length==0){
            return null;
        }
        else{
            return workerRow[0].sid;
        }
    }

getRowFromWorkerTable(contact_uri){
        return sequelize.query("select * from worker where contact_uri='"+contact_uri+"'",
        { type: sequelize.QueryTypes.SELECT});
    }

我在类方法中使用var 声明了所有变量,例如

var workerSid=await database.getWorkerSid(contact_uri);

现在可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2022-08-14
    • 2020-08-16
    • 2018-12-15
    • 2020-11-05
    • 2017-10-12
    • 2019-11-06
    相关资源
    最近更新 更多