Почему Await не блокирует следующую строку кода? - PullRequest
0 голосов
/ 31 марта 2019

Я использую асинхронную функцию для запуска сервера, проверьте, возвращает ли URL-адрес 200, а затем запустите мои тесты, но моя функция checkUrl не завершается до запуска следующей строки кода.

Я использую пакет axios, чтобы пропинговать 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 будет сообщением, возвращаемым Promise.resolve() в моей функции checkUrl.

val возвращается неопределенным.

1 Ответ

4 голосов
/ 31 марта 2019

Проблема в том, что setTimeout в блоке catch.Это асинхронно, но блок catch немедленно возвращается.Так как ему нечего возвращать, он возвращает undefined.Чтобы решить эту проблему (а также сохранить желаемое поведение ожидания), вы можете сделать что-то вроде этого:

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

Это создаст Обещание, которое разрешается через 5 секунд, а при разрешении вызывает checkUrl.

...