gpt4 book ai didi

node.js - async/await 函数未按正确顺序执行

转载 作者:行者123 更新时间:2023-12-03 22:38:27 25 4
gpt4 key购买 nike

我有一系列 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

所以这让我认为我们已经到了 sequelize.query() 中的 database.getWorkerSid() 调用,但随后执行继续而不等待查询 promise 解决,并且就行了:
console.log("updateWorker: workerSid is "+workerSid);
workerSid 未定义,因此发生崩溃并且错误传播回主代码中的 try/catch 块。

基本上,我想做的是:
  • 根据workerSid
  • 从数据库中获取 contact_uri
  • 使用 workerSid 更新 worker
  • 更新完成后,将更新信息输出到控制台

  • 我应该如何设置异步/等待以确保事件按此顺序发生?

    最佳答案

    我重构了 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);
    它现在有效。

    关于node.js - async/await 函数未按正确顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54572240/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com