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

From a cloud function: how to call JavaScript function that is recursive?

这个递归代码是不是写错了,还是说即使执行了递归,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);
    });
});

正在执行测试递归returns控制台没有错误。

信息控制台日志显示

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

再次执行测试递归会在信息控制台日志中显示这一点。

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 次执行测试递归会在信息控制台日志中显示此信息。

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 中提到的内容 您可以使用递归,只是不能递归调用 Cloud Functions,因为该 Cloud Functions 请求将在不同的线程上执行。改用从 Cloud Functions 启动的常规 JavaScript 函数。 - Héctor Ramos 大约 2 年前

事实证明,testrecur() 需要 return 一个承诺,以便调用者(在本例中为 testrecursion())将等待 testrecur() 完成,然后再启动承诺中的下一个链。实际代码可在

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