这个递归编码是错误的还是只是即使执行递归也不总是执行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年前
答案 0 :(得分:0)
事实证明,testrecur()需要返回一个promise,这样调用者(在本例中为testrecursion())将在启动promise中的下一个链之前等待testrecur()完成。实际代码位于How to return a value from a regular javascript function that contains a promise chain?
顺便说一句,这个问题中的递归代码是正确的,因为递归正确发生。我们只需要按顺序绑定promises,这样每次递归调用都有机会在调用函数完成之前完全执行。