如何做出递归承诺

时间:2016-07-28 11:36:45

标签: javascript ajax asynchronous promise crud

我想在我的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会创建新的解析和拒绝函数,但我希望它能够解决或拒绝原始的承诺

2 个答案:

答案 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))
}