Javascript 如何做出递归承诺
我想向javascript HTTP服务添加重试逻辑,该服务在内部使用Axios并返回承诺。目标是重试获取/发布,直到解决或超过重试限制。我提出了这个草案(不按原样工作)Javascript 如何做出递归承诺,javascript,ajax,asynchronous,promise,crud,Javascript,Ajax,Asynchronous,Promise,Crud,我想向javascript HTTP服务添加重试逻辑,该服务在内部使用Axios并返回承诺。目标是重试获取/发布,直到解决或超过重试限制。我提出了这个草案(不按原样工作) 据我所知,在catch中调用fetchSomething会创建新的解析和拒绝函数,但我希望它解析或拒绝原始承诺这个更简单的版本(未经测试!)如何: 您不需要创建新的承诺。实际上,使用Promise构造函数表示您做错了什么 return-fetchSomething(numRetry++)认为最好在更高的抽象级别上调用“reje
据我所知,在catch中调用fetchSomething会创建新的解析和拒绝函数,但我希望它解析或拒绝原始承诺这个更简单的版本(未经测试!)如何:
您不需要创建新的
承诺
。实际上,使用Promise构造函数表示您做错了什么
return-fetchSomething(numRetry++)认为最好在更高的抽象级别上调用“reject”回调的内部函数
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)
})
});
}
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
});
}
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))
}