获取重试请求(失败时)
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))
)()
【讨论】:
以上是关于获取重试请求(失败时)的主要内容,如果未能解决你的问题,请参考以下文章
使用 jQuery 在失败时重试 AJAX 请求的最佳方法是啥?
拉取功能错误;打开 URL 时,“...”的 keepalive 请求失败,重试新连接