javascript - Async/Await 实际上并没有在 while 循环中等待

标签 javascript node.js api loops async-await

在我的项目即将结束时,我意识到对于它的最后一个组件,我别无选择,只能使用 Async、Await 和 Promise,以便程序等待 API 调用完成,然后继续。尽管我了解到 Javascript 中确实没有“停止”或“等待”。我试过下面的代码,它在没有 while 循环的情况下也能工作,但有了它,它就停止工作了。我希望程序多次发送推文 API 调用,但我觉得 sendOff() 函数实际上并没有在等待,循环只是跳过它,因为它运行得太快并且没有等待 API 调用完成。非常感谢任何帮助或不同的攻击方法。

function sendTweets() {
  return new Promise ((resolve, reject) => {
    client.post('statuses/update', final_tweet, function(error, tweet, response) {
      if (error) {
        reject(error);
      }
      resolve(response);
    });
  });
}

async function sendOff() {
  await sendTweets();
}


while (1) {

  var final_tweet = {  // Create tweet struct
    status: "Hi!"
  }

  sendOff();

  sleep.sleep(4);
}

编辑:对于遇到同样问题的人

下面的代码结束了

function sendTweets(final_tweet) {
  return new Promise ((resolve, reject) => {
    client.post('statuses/update', final_tweet, function(error, tweet, response) {
      if (error) {
        reject(error);
      }
      resolve(response);
    });
  });
}

(async () => {
  while (1) {
    var final_tweet = {  // Create tweet struct
      status: "Hi!"
    }
    await sendTweets(final_tweet);
    await sleep.sleep(4);
}
})().catch(e => { console.error(e) }) // Catch needed to prevent "Unhandled Promise Rejection" error

非常感谢@knobiDev @TARN4TION @Nitin Goyal

最佳答案

您必须将 while 循环放在 async 中,并使用 await 语句才能同步执行它们。

您可以将 while 包装在 async 中,如下所示,并省略不必要的 sendOff() 方法。您还应该将 final_tweet 作为参数传递。

function sendTweets(final_tweet) {
  return new Promise ((resolve, reject) => {
    client.post('statuses/update', final_tweet, function(error, tweet, response) {
      if (error) {
        reject(error);
      }
      resolve(response);
    });
  });
}

(async () => {
  while (1) {
    var final_tweet = {  // Create tweet struct
      status: "Hi!"
    }
    await sendTweets(final_tweet);
    await sleep.sleep(4); 
}
})()

关于javascript - Async/Await 实际上并没有在 while 循环中等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65388807/

相关文章:

api - 选择 flutter 中下拉按钮的初始值

api - 请求模块出错

javascript - 当到达 "0"时停止倒计时

javascript - 如何创建带参数的函数可以传递express.get()方法?

node.js - 如何将 Dialog.Delegate 指令返回给 Alexa Skill 模型?

javascript - Node js 中的身份验证过程中出现无效盐错误

javascript - Nodejs异步mongodb保存或更新

javascript - Vue - 获取没有(事件)的元素调用函数

javascript - 如何从字符串中删除后缀?

javascript - Shopify - 私有(private)应用程序,401 未经授权(Javascript)