【问题标题】: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 ++)
  • 认为最好在更高的抽象级别上调用您的函数内部“拒绝”回调

标签: javascript ajax asynchronous promise crud


【解决方案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
            });
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-10
      • 2014-02-04
      • 1970-01-01
      • 2016-12-23
      • 2017-03-26
      • 2017-01-31
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      相关资源
      最近更新 更多