异步/等待正确的顺序不执行功能
我有异步/等待功能的序列,但它们似乎在建议执行并不被阻止由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()
呼叫,但随后继续执行,而不必等待查询的承诺来解决,并就行了:
console.log("updateWorker: workerSid is "+workerSid);
该workerSid
未定义所以有一个碰撞和错误传播回升到主代码中的try / catch块。
基本上,我想要做的是:
- 基于
workerSid
从数据库中获取contact_uri
- 使用
workerSid
更新工人 - 一旦更新完成,有关更新的信息输出到控制台
我应该怎么会有我的异步/伺机成立,以确保事件顺序发生的呢?
回答如下:我重构database.getWorkerSid()
,摆脱了无极构造反模式,如下所示:
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);
它现在。
异步/等待正确的顺序不执行功能
我有异步/等待功能的序列,但它们似乎在建议执行并不被阻止由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()
呼叫,但随后继续执行,而不必等待查询的承诺来解决,并就行了:
console.log("updateWorker: workerSid is "+workerSid);
该workerSid
未定义所以有一个碰撞和错误传播回升到主代码中的try / catch块。
基本上,我想要做的是:
- 基于
workerSid
从数据库中获取contact_uri
- 使用
workerSid
更新工人 - 一旦更新完成,有关更新的信息输出到控制台
我应该怎么会有我的异步/伺机成立,以确保事件顺序发生的呢?
回答如下:我重构database.getWorkerSid()
,摆脱了无极构造反模式,如下所示:
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);
它现在。