Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步/等待/返回不等待响应_Javascript_Node.js - Fatal编程技术网

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

Javascript 异步/等待/返回不等待响应,javascript,node.js,Javascript,Node.js,我有一个函数,可以循环浏览电话号码列表。如果其中一个号码符合条件,它会将信息记录在一个表中,然后发送短信并搜索另一个号码是否也符合条件 为了实现这一点,我使用Async/wait,但我的问题是,最后一个发送SMS的函数,我有一个console.log,然后它有一个返回;我正在以正确的顺序获取日志,但它不会等待返回的响应 这是我的密码 return t.any(Query).then(function(Response){ const getQualifiedUsers = async()

我有一个函数,可以循环浏览电话号码列表。如果其中一个号码符合条件,它会将信息记录在一个表中,然后发送短信并搜索另一个号码是否也符合条件

为了实现这一点,我使用Async/wait,但我的问题是,最后一个发送SMS的函数,我有一个
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
,然后返回搜索,而不是发送消息。完成后,它会尝试发送所有短信。因此,它不会等待
返回上的响应。我已经改变了很多次,但我似乎不知道我错过了什么,为什么我不能等待回复。

这不管用吗?如果要并行运行它们,请查看


我认为您的问题在于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返回承诺,则省略回调:

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);
  });
}

它不等待等待的原因是异步函数被同步调用(无等待)
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);
   }
}
它应该能正常工作

编辑:Oops我在您的
insertable()
中遗漏了一些内容,基本上是相同的,因此请更改为以下内容:

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);
   }
}

我认为问题在于async/await和promise之间的混合。您等待then的承诺,而不是等待异步函数!!
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);
   }
}