javascript - 在移动到另一个迭代之前等待内部循环
问题描述
我正在尝试使用函数通过 API 发送消息。当函数完成他的职责时,它返回一个值,messageLodId
它需要Attendence
在主循环中更新。但是当我执行此代码时,值未定义。
有两个问题:
1)结构对吗?
2) 如果是,请提供此问题的答案。
//Posting SMS
router.post('/sms/', async function(req, res) {
let attendenceRecordId = parseInt(req.body.attendenceRecordId);
let result = await AttendenceRecord.findOne({where: {id: attendenceRecordId }, include: [ {model: Attendence, include: [{model: Student}
]}, {
model: Class
}], order: [['date', 'DESC']]});
if(!result) {
res.sendStatus(404);
}
for await (let attendence of result.attendences){
let messageLogId = await sendSMS(attendence);
console.log("Message ID: ", messageLogId);
Attendence.update(
{ smsLogId: messageLogId },
{ where: { id: attendence.id } }
);
}
AttendenceRecord.update(
{ isMessageSent:true },
{ where: { id: result.id } }
);
res.send({messageSent: true});
});
这是函数定义。现在我只返回 1。
在现实世界中,URL 返回一个代码。
async function sendSMS(attendence){
//console.log(target);
setTimeout(function(){
let message = `Respected Parent, your son/daughter ${attendence.student.name} is absent on ${attendence.date}`;
let messageURL = encodeURI(message);
let api = 'SOME VALUE';
let phone = attendence.student.fphone.substring(1, 11);
let target = `http://BASE_URL/api.php?key=${api}&receiver=92${phone}&sender=DigitalPGS&msgdata=${messageURL}`;
return 1;
}, 2000);
}
解决方案
您应该sendSMS
返回一个承诺,并等待:
exec();
async function exec()
{
var records = [1,2,3];
for(var i=0;i<records.length;i++)
{
var messageLogId = await sendSMS(records[i]);
console.log("Result received from resolve", messageLogId);
}
}
function sendSMS(record)
{
// simulate an async method:
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log("Send sms for record", record);
resolve(1);
}, 1000);
});
}
注意setTimeout
这里只是为了演示一个异步动作。在现实世界中,您的sendSMS
函数无疑会调用一个 API,该 API 本身是异步的 - 只需从中返回 Promise(或者,如果 API 客户端不返回,则将调用包装在 Promise 中)。
推荐阅读
- python - argparser.print_help() 没有打印完整的消息
- r - 尝试使用 R 对 MS Dynamics CRM 2016 WebApi 进行身份验证
- sql - 如何将比率四舍五入到 Postgresql 中的最低整数值?
- traefik - Traefik V2 获取通配符证书
- javascript - 如何记录和更新剪刀石头布游戏的输赢历史?
- cmake - 尝试在 Ubuntu 上配置 CMake 工具链
- rust - 有没有办法在 Rust 中删除静态生命周期对象?
- c - 小数点后的数字在排序后消失
- java - Mockito 模拟数据库调用
- flutter - EditingTextController 在不调用 setState() 的情况下更新小部件值 - Flutter