异步/等待/不等待响应返回

时间:2019-11-29 15:46:23

标签: javascript node.js

我有一个遍历电话号码列表的功能。如果其中一个符合条件,它将在表格上记录信息,然后发送SMS并搜索另一个数字是否也符合条件。

要实现这一点,我正在使用Async / Await,但是我的问题是发送短信的最后一个函数是console.log,然后有一个返回值。我正在按正确的顺序获取日志,但它不是在等待返回的响应。

这是我的代码。

return t.any(Query).then(function(Response){
   const getQualifiedUsers = async() => {
     try{
       if("meets criteria"){
         try{
            await insertInTable()
         }catch(error){
           console.log(error);
         }
       }
     }catch(error){
        console.log(error);
     }
   }
    getQualifiedUsers();
}


async function insertInTable(){
   try{
        await db.any(secondQuery).then(function(numberSaved){
      const sendAsyncSMS = async () => {
         try{
            await sendSMS();
         }catch(error){
            console.log(error);
         }
      }
      sendAsyncSMS();
   }
   }catch(error){
      console.log(error);
   }
}

async function sendSMS() {
   var date = moment().utc().format('MM-DD-YYYY HH:mm:ss');
   console.log('date', date);

   return client.messages.create(params, function(err, data, message) {
     if(err){
        return 'done'
     }else{
        return 'done'
     }
   })
   .then(message => 
        console.log(message.sid)
    );
}

有了这个,我得到了回应search-->insert-->log date,然后返回搜索而不是发送消息。完成后,它将尝试发送所有SMS。因此,它不等待return上的响应。我已经对此进行了很多次更改,但是我似乎无法弄清我想念的是什么以及为什么我不能等待响应。

3 个答案:

答案 0 :(得分:1)

它不等待等待的原因是因为您的异步函数被同步调用(没有等待)getQualifiedUsers(),所以它运行它,但不等待它完成。

由于您似乎正在兑现承诺,因此可以更改此内容:

return t.any(Query).then(function(Response){
   const getQualifiedUsers = async() => {
     try{
       if("meets criteria"){
         try{
            await insertInTable()
         }catch(error){
           console.log(error);
         }
       }
     }catch(error){
        console.log(error);
     }
   }
    getQualifiedUsers();
}

对此:

return t.any(Query).then(async function(Response) {
   try {
     if ("meets criteria") {
       try {
          await insertInTable()
       } catch(error) {
         console.log(error);
       }
     }
   } catch(error) {
      console.log(error);
   }
}

它应该可以正常工作。

编辑:糟糕,我错过了您的insertInTable()中的某些内容,基本上是相同的,因此请将其更改为以下内容:

async function insertInTable(){
   try {
     await db.any(secondQuery).then(async function(numberSaved) {
       try {
         await sendSMS();
       } catch(error){
         console.log(error);
       }
     }
   } catch(error) {
      console.log(error);
   }
}

答案 1 :(得分:0)

这行不行吗?如果要并行运行它们,请查看Promise.all

async function insertInTable(){
   try {
       await db.any(secondQuery);
       await sendSMS();
   } catch(error) {
      console.log(error);
   }
}

答案 2 :(得分:0)

我认为您的问题出在sendSMS函数中,尤其是您将回调传递给client.messages.create函数的事实,这可能会影响诺言。

尝试以下方法:

async function sendSMS() {
  var date = moment().utc().format('MM-DD-YYYY HH:mm:ss');
  console.log('date', date);

  return new Promise(function(resolve, reject){
    client.messages.create(params, function(err, data, message) {
      if(err)
        reject();
      else
        resolve();
      console.log(message.sid);
    });
  });
}

或者如果函数client.messages.create返回一个Promise,则忽略回调:

async function sendSMS() {
  var date = moment().utc().format('MM-DD-YYYY HH:mm:ss');
  console.log('date', date);

  return client.messages.create(params).then(function(message){
    console.log(message.sid);
  });
}