如何做出递归承诺
Posted
技术标签:
【中文标题】如何做出递归承诺【英文标题】:How to make recursive promise 【发布时间】:2016-12-02 18:40:20 【问题描述】:我想向我的 javascript HTTP 服务添加重试逻辑,该服务在内部使用 Axios 并返回 Promise。目标是重试获取/发布,直到它解决或超过重试限制。我想出了这个草稿(没有按原样工作)
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 会创建新的解析和拒绝函数,但我希望它解析或拒绝原来的承诺
【问题讨论】:
返回 fetchSomething(numRetry ++) 认为最好在更高的抽象级别上调用您的函数内部“拒绝”回调 【参考方案1】:您无需创建新的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))
【讨论】:
【参考方案2】:这个更简单的版本怎么样(未经测试!):
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
);
【讨论】:
以上是关于如何做出递归承诺的主要内容,如果未能解决你的问题,请参考以下文章