Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Axios侦听器在状态为200且数据为空时重试http请求_Node.js_Reactjs_Http_Axios - Fatal编程技术网

Node.js Axios侦听器在状态为200且数据为空时重试http请求

Node.js Axios侦听器在状态为200且数据为空时重试http请求,node.js,reactjs,http,axios,Node.js,Reactjs,Http,Axios,在某些数据准备就绪之前,我会短时间轮询一个端点。我希望重试该请求最多10次 当数据还没有准备好时,我收到一个带有空数组的200 当数据准备就绪时,我接收到一个带有非空数组的200 我使用以下库 我已经创建了一个axios拦截器来检查数组的长度,如果它的0我抛出了一个错误。但是,axiosRetry没有捕获到这一点,此时我希望重试该请求。相反,它被捕获在try-catch块中并结束。您不需要axios重试,只需要axios及其响应拦截器,执行以下步骤: 检查数据是否为空。如果是,抛出一个axio

在某些数据准备就绪之前,我会短时间轮询一个端点。我希望重试该请求最多10次

当数据还没有准备好时,我收到一个带有空数组的200

当数据准备就绪时,我接收到一个带有非空数组的200

我使用以下库


我已经创建了一个axios拦截器来检查数组的长度,如果它的0我抛出了一个错误。但是,axiosRetry没有捕获到这一点,此时我希望重试该请求。相反,它被捕获在try-catch块中并结束。

您不需要axios重试,只需要axios及其响应拦截器,执行以下步骤:

  • 检查数据是否为空。如果是,抛出一个
    axios.Cancel
    错误。这将取消请求,调用错误处理程序而不是成功处理程序
  • 在错误处理程序中,如果我们没有超过最大重试次数(在您的情况下是10),请重新发送HTTP请求
  • 继续运行步骤1和2,直到获得数据或重试10次
  • 代码如下所示:

    const axios = require('axios');
    
    const MAX_RETRY = 10;
    let currentRetry = 0;
    
    function successHandler() {
      console.log('Data is Ready');
    }
    
    function errorHandler() {
      if (currentRetry < MAX_RETRY) {
        currentRetry++;
        console.log('Retrying...');
        sendWithRetry();
      } else {
        console.log('Retried several times but still failed');
      }
    }
    
    function sendWithRetry() {
      axios.get('http://example.com')
        .then(successHandler).catch(errorHandler);
    }
    
    axios.interceptors.response.use(function (response) {
      if (response.data.metrics.length) {
        throw new axios.Cancel('Operation canceled by the user.');
      } else {
        return response;
      }
    }, function (error) {
      return Promise.reject(error);
    });
    
    sendWithRetry();
    

    您不需要axios重试,只需要axios及其响应拦截器,步骤如下:

  • 检查数据是否为空。如果是,抛出一个
    axios.Cancel
    错误。这将取消请求,调用错误处理程序而不是成功处理程序
  • 在错误处理程序中,如果我们没有超过最大重试次数(在您的情况下是10),请重新发送HTTP请求
  • 继续运行步骤1和2,直到获得数据或重试10次
  • 代码如下所示:

    const axios = require('axios');
    
    const MAX_RETRY = 10;
    let currentRetry = 0;
    
    function successHandler() {
      console.log('Data is Ready');
    }
    
    function errorHandler() {
      if (currentRetry < MAX_RETRY) {
        currentRetry++;
        console.log('Retrying...');
        sendWithRetry();
      } else {
        console.log('Retried several times but still failed');
      }
    }
    
    function sendWithRetry() {
      axios.get('http://example.com')
        .then(successHandler).catch(errorHandler);
    }
    
    axios.interceptors.response.use(function (response) {
      if (response.data.metrics.length) {
        throw new axios.Cancel('Operation canceled by the user.');
      } else {
        return response;
      }
    }, function (error) {
      return Promise.reject(error);
    });
    
    sendWithRetry();
    

    或者,如果数据不存在,axiosRetry知道重试,是否有办法截取响应并覆盖它。如果数据不存在,是否有办法截取响应并覆盖它,axiosRetry知道重试。我想使用axios retry作为内置的退避策略。没有办法使用axios重试库进行重试吗?@Kay不幸的是,我认为没有任何方法可以使用axios重试来实现您的需求。我已经编辑了我的答案来说明原因。哦,太糟糕了,我将不得不考虑使用不同的库,可以在2xx上进行重试,以及退避策略。也许如果你或其他看到这一点的人知道这样一个库,你可以推荐它。嗨,@Kay,正如我在回答中所描述的,你不需要任何新的库:)你可以实现你自己的“在2xx上重试”逻辑作为退避。我想使用axios retry作为它内置的退避策略。没有办法使用axios重试库进行重试吗?@Kay不幸的是,我认为没有任何方法可以使用axios重试来实现您的需求。我已经编辑了我的答案来说明原因。哦,太糟糕了,我将不得不考虑使用不同的库,可以在2xx上进行重试,以及退避策略。也许,如果你或其他看到这一点的人知道这样一个库,你可以推荐它。嗨,@Kay,正如我在回答中所描述的,你不需要任何新的库:)你可以实现你自己的“在2xx上重试”逻辑作为退避。
    export default function axiosRetry(axios, defaultOptions) {
      axios.interceptors.request.use(config => {
        const currentState = getCurrentState(config);
        currentState.lastRequestTime = Date.now();
        return config;
      });
    
      axios.interceptors.response.use(null, error => {
        const config = error.config;
    
        // If we have no information to retry the request
        if (!config) {
          return Promise.reject(error);
        }
        ....