У меня есть последовательность асинхронных / ожидающих функций, но они, кажется, выполняются в порядке, который предполагает, что выполнение не блокируется операторами 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 в основном коде.
По сути, то, что я пытаюсь сделатьis:
- Получить
workerSid
из базы данных на основе contact_uri
- Используйте
workerSid
для обновления работника - После завершения обновления выведите информацию ообновить до консоли
Как настроить асинхронное ожидание / ожидание, чтобы события происходили в этом порядке?