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

时间:2016-02-03 19:20:12

标签: javascript node.js loops http request

我目前有工作代码执行请求并检查它是否收到成功的状态代码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');
    }
});

2 个答案:

答案 0 :(得分:9)

会是这样的:

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

您可以设置最大重试次数和重试之间的超时时间。因此,您不会引入无限循环,并且您不会向重载的请求目标提供最终的打击^^

答案 1 :(得分:2)

我想要一个更直观的答案,包括承诺。我在miggs回答的基础上构建了一个try / catch下面的代码和promises axios

基于递归函数的简单示例

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

没有超时但对我有用。