【发布时间】:2019-08-27 11:14:12
【问题描述】:
我正在尝试使用函数通过 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不返回任何内容,所以你会得到undefined -
函数
sendSMS不返回任何内容。只有setTimeout的回调有return 语句。 -
添加:
for await不需要,你已经在等待上面的结果了。看看how to wrap setTimeout in a promise & return one -
但结果是反应也很快。我的意思是它不会像我每次迭代延迟 2 秒那样延迟。
标签: javascript node.js api express