从云函数:如何调用递归的JavaScript函数?

时间:2015-10-12 07:25:39

标签: javascript recursion parse-platform cloud-code

这个递归编码是错误的还是只是即使执行递归也不总是执行console.log()?

function testrecur(s) {
    console.log("begin testrecur=" + s);
    s++;
    if (s < 10) {
        testrecur(s);
    } else {
        return s;
    }
}
Parse.Cloud.define("testrecursion", function(request, response) {
    Parse.Promise.as().then(function() {
        return testrecur(0);
    }).then(function(Result) {
        response.success(Result);
    }, function(error) {
        response.error(error);
    });
});

执行testrecursion在控制台中不返回任何错误。

信息控制台日志显示

I2015-10-10T08:55:17.308Z]begin testrecur=0
I2015-10-10T08:55:17.309Z]begin testrecur=1
I2015-10-10T08:55:17.315Z]begin testrecur=7
I2015-10-10T08:55:17.316Z]begin testrecur=8

再次执行testrecursion会在info控制台日志中显示此内容。

I2015-10-10T08:19:15.970Z]begin testrecur=0
I2015-10-10T08:19:15.971Z]begin testrecur=1
I2015-10-10T08:19:15.972Z]begin testrecur=2
I2015-10-10T08:19:15.973Z]begin testrecur=3
I2015-10-10T08:19:15.974Z]begin testrecur=4
I2015-10-10T08:19:15.975Z]begin testrecur=5
I2015-10-10T08:19:15.978Z]begin testrecur=8

第3次执行testrecursion会在info控制台日志中显示。

I2015-10-10T08:22:14.729Z]begin testrecur=2
I2015-10-10T08:22:14.731Z]begin testrecur=4
I2015-10-10T08:22:14.732Z]begin testrecur=5
I2015-10-10T08:22:14.733Z]begin testrecur=6
I2015-10-10T08:22:14.734Z]begin testrecur=7

经过数十次测试后,递归步骤似乎偶尔被称为。输出似乎是随机的。预期的输出是

I2015-10-10T08:19:15.970Z]begin testrecur=0
I2015-10-10T08:19:15.971Z]begin testrecur=1
I2015-10-10T08:19:15.972Z]begin testrecur=2
I2015-10-10T08:19:15.973Z]begin testrecur=3
I2015-10-10T08:19:15.974Z]begin testrecur=4
I2015-10-10T08:19:15.975Z]begin testrecur=5
I2015-10-10T08:19:15.975Z]begin testrecur=6
I2015-10-10T08:19:15.975Z]begin testrecur=7
I2015-10-10T08:19:15.975Z]begin testrecur=8
I2015-10-10T08:19:15.975Z]begin testrecur=9

这看起来是否正确发生了递归,而且只是控制台日志没有记录所有消息?

我正在尝试实施Hector Ramos在https://www.parse.com/questions/error-too-many-recursive-calls-into-cloud-code中提到的内容 您可以使用递归,因为云函数请求将在不同的线程上执行,所以您无法递归调用云函数。使用从云功能启动的常规JavaScript函数。 - HéctorRamos大约2年前

1 个答案:

答案 0 :(得分:0)

事实证明,testrecur()需要返回一个promise,这样调用者(在本例中为testrecursion())将在启动promise中的下一个链之前等待testrecur()完成。实际代码位于How to return a value from a regular javascript function that contains a promise chain?

顺便说一句,这个问题中的递归代码是正确的,因为递归正确发生。我们只需要按顺序绑定promises,这样每次递归调用都有机会在调用函数完成之前完全执行。