获取重试请求(失败时)

Posted

技术标签:

【中文标题】获取重试请求(失败时)【英文标题】:fetch retry request (on failure) 【发布时间】:2018-02-20 20:57:54 【问题描述】:

我正在使用浏览器的原生 fetch API 进行网络请求。我还在为不受支持的浏览器使用whatwg-fetch polyfill。

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

【问题讨论】:

这能回答你的问题吗? How to try JS fetch() method in a loop 【参考方案1】:

来自获取文档:

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

看到那个捕获了吗?提取失败时会触发,您可以在那里再次提取。 看看Promise API。

实现示例:

function wait(delay)
    return new Promise((resolve) => setTimeout(resolve, delay));


function fetchRetry(url, delay, tries, fetchOptions = ) 
    function onError(err)
        triesLeft = tries - 1;
        if(!triesLeft)
            throw err;
        
        return wait(delay).then(() => fetchRetry(url, delay, triesLeft, fetchOptions));
    
    return fetch(url,fetchOptions).catch(onError);

编辑 1:as suggested by golopot,p-retry 是一个不错的选择。

编辑 2:简化的示例代码。

【讨论】:

这正是我目前正在做的。但我正在寻找类似额外的可选 retry: 3, //最大重试次数 retryTimeout: 3000 //连续请求之间的超时 我刚刚用我认为应该是一个工作版本的版本更新了这个例子,你可能需要一些艰难的调整。告诉我你是否想在代码中添加一些 cmets 使其更清晰。 这是needlessly complex 感谢@BenjaminGruenbaum 指出代码非常混乱【参考方案2】:

我建议使用一些库进行承诺重试,例如p-retry。

例子:

const pRetry = require('p-retry')
const fetch = require('node-fetch')

async function fetchPage () 
  const response = await fetch('https://***.com')

  // Abort retrying if the resource doesn't exist
  if (response.status === 404) 
    throw new pRetry.AbortError(response.statusText)
  

  return response.blob()


;(async () => 
  console.log(await pRetry(fetchPage, retries: 5))
)()

【讨论】:

以上是关于获取重试请求(失败时)的主要内容,如果未能解决你的问题,请参考以下文章

使用Apache HttpClient 4.x进行异常重试

使用 jQuery 在失败时重试 AJAX 请求的最佳方法是啥?

RPC异常重试机制详解

拉取功能错误;打开 URL 时,“...”的 keepalive 请求失败,重试新连接

KAFKA SINK CONNECT: WARN 批量请求 167 失败。重试请求

如何使用 Moya 框架重试请求