我正在使用浏览器的原生fetch API来处理网络请求。此外,我正在使用whatwg-fetch polyfill用于不受支持的浏览器。
但是,如果请求失败,我需要重试。现在我找到了这个npm包whatwg-fetch-retry,但他们没有解释如何在他们的文档中使用它。有人可以帮我这个或建议我一个替代方案吗?
答案 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
})