如何做出递归承诺

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
        );

【讨论】:

以上是关于如何做出递归承诺的主要内容,如果未能解决你的问题,请参考以下文章

使用承诺和递归迭代文件目录

如何使用 Promise Kit 调用递归函数?

节点递归承诺永远不会退出

节点 q 承诺递归

在 node.js 中承诺一个递归函数

NodeJs分页,递归承诺问题