递归调用Promise

时间:2017-08-22 19:28:07

标签: javascript node.js bluebird

我有一个方法可以进行post调用,并且在成功时会解析一个promise,但如果post调用由于某种原因失败,我想实现递归逻辑来调用解析promise的方法。如何实现这一点以有效地处理承诺。下面是我正在尝试的代码。现在,当服务调用失败时,它正在重试,但是我得到了未处理的拒绝错误,它正在再次自行重试,然后拒绝。

dummyService.getAction = (requestData) => {

    var options = {
        url: config.url,
        json: true,
        body: requestData,
        method: 'post',
        headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'x-request-id': 'IntegrationTesting'
        }
    }

    return new Promise(function (resolve, reject) {
     request(options, function (error, response, body) {

            const success = new RegExp('^2\\d{2}$');
            const failure = new RegExp('^4\\d{2}$');

            if (error) {                
                reject(response);
            }
            else if (failure.test(response.statusCode) || recursive > 5) {                
                reject(response);
            }
            else if (success.test(response.statusCode) && body) {                
                resolve(body);
            }
            else {                
                recursive++;
                setTimeout(function () {
                    dummyService.getAction(requestData)
                }, 500);
            }
        })
    })
}

1 个答案:

答案 0 :(得分:1)

问题在于dummyService.getAction在您重试时返回的承诺基本上被忽略了。试试这个:

setTimeout(function () {
    dummyService.getAction(requestData).then(resolve, reject);
}, 500);