来自云函数:如何调用递归的 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() 完成,然后再启动承诺中的下一个链。实际代码可在
顺便说一下,这个问题中的递归代码是正确的,因为递归是正确发生的。我们只需要按顺序绑定承诺,这样每个递归调用都有机会在调用函数完成之前完全执行。
这个递归代码是不是写错了,还是说即使执行了递归,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() 完成,然后再启动承诺中的下一个链。实际代码可在
顺便说一下,这个问题中的递归代码是正确的,因为递归是正确发生的。我们只需要按顺序绑定承诺,这样每个递归调用都有机会在调用函数完成之前完全执行。