Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何做出递归承诺_Javascript_Ajax_Asynchronous_Promise_Crud - Fatal编程技术网

Javascript 如何做出递归承诺

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

我想向javascript HTTP服务添加重试逻辑,该服务在内部使用Axios并返回承诺。目标是重试获取/发布,直到解决或超过重试限制。我提出了这个草案(不按原样工作)


据我所知,在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))
}