Javascript递归承诺陷入无限循环

时间:2015-07-16 18:33:25

标签: javascript promise infinite-loop recursive-query bluebird

我创建了一个递归promise函数:

this.testFunction = Bluebird.method(function (instanceID) {
        var object = this;
        return object.canSsh(instanceID)
        .then(function (sshable) {
            if (sshable) {
                return object.onSshable(instanceID)
                .then(function () {
                    return Bluebird.resolve();
                });
            }
            else {
                return Bluebird.delay((SSH_POLLING_INTERVAL * 1000))
                .then(function () {
                    return object.testFunction(instanceID);
                });
            }
        })
        .catch(function (err) {
            return Bluebird.reject(err);
        });
    });

但是,即使sshable成为真,此函数也会在无限循环中递归地继续运行。我预计,一旦我从sshable块返回,它应该存在函数。

1 个答案:

答案 0 :(得分:1)

  

即使sshable变为真,该函数也会以无限循环递归地继续进行。

我无法重现。看来其他内容正在调用您的testFunction,而不是来自延迟then回调的递归调用。

无论如何,您可以大大简化您的功能:

this.testFunction = function(instanceID) {
    return this.canSsh(instanceID).then(function(sshable) {
        if (sshable) {
            return this.onSshable(instanceID);
        } else {
            return Bluebird.delay(SSH_POLLING_INTERVAL * 1000)
            .then(this.testFunction.bind(this, instanceID));
        }
    }.bind(this))
};