获取重试请求(失败时)

时间:2017-09-12 11:51:58

标签: javascript fetch-api polyfills

我正在使用浏览器的原生fetch API来处理网络请求。此外,我正在使用whatwg-fetch polyfill用于不受支持的浏览器。

但是,如果请求失败,我需要重试。现在我找到了这个npm包whatwg-fetch-retry,但他们没有解释如何在他们的文档中使用它。有人可以帮我这个或建议我一个替代方案吗?

2 个答案:

答案 0 :(得分:5)

来自官方提取文档:

fetch('/users')
    .then(checkStatus)
    .then(parseJSON)
    .then(function(data) {
          console.log('succeeded', data)
    }).catch(function(error) {
          console.log('request failed', error)
    })

看到那个捕获?将在获取失败时触发,例如,您可以再次获取。

查看承诺https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

编辑:添加应该返回结果的工作示例。已经尝试过使用Chrome(v.60.0)并且没有使用任何polyfill,也没有使用你提到的软件包(仔细阅读文档之后,它似乎只是来自fetch polifyll的一个分支)。

function fetchRetry(url, delay, limit, fetchOptions = {}) {
    return new Promise((resolve,reject) => {
        function success(response) {
            resolve(response);
        }
        function failure(error){
            limit--;
            if(limit){
                setTimeout(fetchUrl,delay)
            }
            else {
                // this time it failed for real
                reject(error);
            }
        }
        function finalHandler(finalError){
            throw finalError;
        }
        function fetchUrl() {
            return fetch(url,fetchOptions)
                .then(success)
                .catch(failure)
                .catch(finalHandler);
        }
        fetchUrl();
    });
}

fetchRetry('https://www.google.es',1000,4)  
   .then(function(response){
       if(!response.ok){
           throw new Error('failed!');
       }
       return response;
   })
   .then(function(response){
       console.log(response);
   })
   .catch(function(error){
       console.log(error);
    });

Haven没有测试重试尝试是否会返回响应,但我想他们会这样做。

修改:找到了此软件包,但它取代了fetch API,因此我不太确定,https://www.npmjs.com/package/fetch-retry(在第一个google结果页面中还有两个像这样的软件包用于获取重试...)

答案 1 :(得分:0)

此库:async-retry

其文档中的示例:

const retry = require('async-retry')
const fetch = require('node-fetch')

await retry(async bail => {
  // if anything throws, we retry
  const res = await fetch('https://google.com')

  if (403 === res.status) {
    // don't retry upon 403
    bail(new Error('Unauthorized'))
    return
  }

  const data = await res.text()
  return data.substr(0, 500)
}, {
  retries: 5
})