首页 > 解决方案 > 在移动到另一个迭代之前等待内部循环

问题描述

我正在尝试使用函数通过 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); 


}

标签: javascriptnode.jsapiexpress

解决方案


您应该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 中)。


推荐阅读