javascript - 为什么 Await 不阻塞下一行代码?

标签 javascript promise async-await axios

我正在使用异步函数启动服务器,检查网址是否返回 200,然后运行测试,但我的 checkUrl 函数未完成在运行下一行代码之前。

我正在使用 axios 包来 ping 状态代码的 url,并且我一直在尝试 async/await 和 Promise.resolve() 的几种变体.

function checkUrl(url) {
  console.log(`Checking for ${url}`);

  return axios
    .get(url)
    .then(function(res) {
      const message = `${url} is status code: ${res.status}`;

      return res;
    })
    .catch(function(err) {
      console.log("Will check again in 5 seconds");
      setTimeout(() => {
        return checkUrl(url);
      }, 5000);
    });
}

async function init() {
  let val;

  console.log("Running tests:::");
  // start server in react-integration directory
  shell.exec("BROWSER=none yarn start", {
    cwd: "sampleIntegration/react-integration",
    async: true
  });
  // check server has started
  val = await checkUrl("http://localhost:3000");

  console.log(`value from checkUrl promise: ${val}`);
}

我期望 val 变量是从我的 checkUrl 函数中的 Promise.resolve() 返回的消息。

val 返回未定义。

最佳答案

问题是 catch block 中的 setTimeout 。这是异步的,但 catch block 会立即返回。由于它没有任何可返回的内容,因此返回未定义。要解决此问题(并保持您期望的等待行为),您可以执行以下操作:

function checkUrl(url) {
  console.log(`Checking for ${url}`);

  return axios.get(url)
    .then(res => {
      const message = `${url} is status code: ${res.status}`;
      return res;
    })
    .catch(err => {
      console.log('Will check again in 5 seconds');
      return new Promise((resolve) => {
         setTimeout(resolve, 5000);
      }).then(() => checkUrl(url));
    });
}

这将产生一个 Promise,它会在 5 秒后解析,并在解析时调用 checkUrl。

关于javascript - 为什么 Await 不阻塞下一行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443455/

相关文章:

javascript - 如何将第十一个字符替换为 "..."

javascript - 在 .then() 中向函数添加参数会破坏 JS 中 Promise 的行为

Javascript 从 map 内的函数获取回调

具有 await 和 async 的 C#5.0 异步 TCP/IP 服务器

javascript - 使用nodejs mysql模块从mysql获取JSON数据

javascript - JQuery 更改 css 在鼠标释放时切换回

javascript - 在 AngularJS 中为自定义指令加上前缀 'ng' 是否明智?

javascript - promise 以不同的方式执行时显示不同的结果

typescript - TypeScript 中没有 float promise 检查

xamarin.forms - OidcClient2 - 在等待 LoginAsync 时关闭 IBrowser