我想在我的javascript HTTP服务中添加重试逻辑,该服务在内部使用Axios并返回promises。目标是重试获取/发布,直到它结算或超过重试限制。我提出了这个草案(不按原样运作)
fetchSomething(numRetry) {
if (!numRetry)
numRetry = 0
return new Promise(function(resolve, reject) {
axios.get('/services/rest/vopa/sanomaloki/virheet')
.then(response => resolve(response))
.catch(response => {
if (numRetry > FETCH_RETRY_LIMIT)
reject(response)
else
return fetchSomething(numRetry + 1)
})
});
}
据我所知,在catch中调用fetchSomething会创建新的解析和拒绝函数,但我希望它能够解决或拒绝原始的承诺
答案 0 :(得分:0)
这个更简单的版本怎么样(未经测试!):
function fetchSomething(numRetry = 0) {
return axios.get('/services/rest/vopa/sanomaloki/virheet')
.catch(response => {
if (numRetry > FETCH_RETRY_LIMIT)
return Promise.reject(response); // pass it on
else
return fetchSomething(numRetry + 1); // might work
});
}
答案 1 :(得分:0)
您不需要创建新的Promise
。实际上使用Promise构造函数表明你做错了什么。 Demo
function fetchSmth(num) {
num = num || 0
return num > FETCH_RETRY_LIMIT
? Promise.reject(new Error('Fetch retry limit reached'))
: axios
.get('/services/rest/vopa/sanomaloki/virheet')
.catch(fetchSmth.bind(null, num + 1))
}