节点 JS:请求循环,直到状态代码 200

Node JS: Request Loop Until Status Code 200

本文关键字:状态 代码 JS 请求 循环 节点      更新时间:2023-09-26

我目前有工作代码可以执行请求并检查它是否收到成功的状态代码 200。我想在此基础上发展并循环它,它将不断发送请求,直到状态代码为 200。我尝试使用 while 循环,但没有收到正确的结果。感谢您的帮助!

request('http://0.0.0.0:9200', function (error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log('success');
      do(something);
    }
    else {
      console.log('fail');
    }
});

会像这样:

let retry = (function() {
  let count = 0;
  return function(max, timeout, next) {
    request('http://0.0.0.0:9200', function (error, response, body) {
      if (error || response.statusCode !== 200) {
        console.log('fail');
        if (count++ < max) {
          return setTimeout(function() {
            retry(max, timeout, next);
          }, timeout);
        } else {
          return next(new Error('max retries reached'));
        }
      }
      console.log('success');
      next(null, body);
    });
  }
})();
retry(20, 1000, function(err, body) {
    do(something);
});

您可以设置最大重试次数和重试之间的超时。这样您就不会引入无限循环,并且不会将最终冲击传递到重载的请求目标^^

我想要一个更直观的答案,包括承诺。我在尝试/捕获下面的代码中构建了 miggs 答案之上,并带有承诺和公理。

基于递归函数的简单示例

const throwNumbers = (count = 0) => {
  console.log(count);
  if (count++ < 10) {
    throwNumbers(count);
  } else {
    console.log('max reached');
  };
};

您可以将其他任何东西放在 try 部分并在 catch 部分处理错误代码。您必须设置最大重试次数,在我的情况下为 10。

let getResponse = async(count = 0) => {
  try {
    const axiosResponse = await axios.get(someURL, {
      params: {
        parameter1: parameter1,
      },
    });
    return axiosResponse;
  } catch (error) {
    if (error || error.status != 200) {
      console.error('failed, retry');
      if (count++ < 10) {
        return getResponse(count);
      } else {
        throw new Error('max retries reached');
      };
    } else {
      throw error;
    };
  };
};

您将使用以下方式调用该函数,并使用响应值处理正文或任何内容。

let response = await getResponse();
console.log('This is the response:', response);

没有超时,但对我有用。