当前位置: 首页 > 知识库问答 >
问题:

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

茅桐
2023-03-14

这个递归编码是错误的还是仅仅是那个控制台。即使执行递归,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

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

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

第三次执行testrecursion会在信息控制台日志中显示这一点。

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 Function请求将在不同的线程上执行。请改用从云函数启动的常规 JavaScript 函数。- 埃克托·拉莫斯约2年前

共有1个答案

麻和雅
2023-03-14

事实证明,testrecur()需要返回一个promise,这样调用方(在本例中为testrecursion())将在开始promise中的下一个链之前等待testrecur()完成。在如何从包含promise链的常规javascript函数返回值方面,实际代码是可用的?

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

 类似资料:
  • 问题内容: 我可以在变量中创建一个递归函数,如下所示: 这样,将输出 。假设我做了以下事情: 将输出 如上。如果我再更改如下: 然后将给出,如预期的那样。 现在给出 它所指的,而不是函数(它本身指向的)。在某些情况下这可能是理想的,但是有没有一种方法可以编写函数以便它调用自身而不是保存它的变量? 也就是说,是否可以 仅 更改线路,以便 在调用时仍能完成所有这些步骤?我试过了,但这给了我错误。 问题

  • 本文向大家介绍JavaScript中匿名函数的递归调用,包括了JavaScript中匿名函数的递归调用的使用技巧和注意事项,需要的朋友参考一下 不管是什么编程语言,相信稍微写过几行代码的同学,对递归都不会陌生。 以一个简单的阶乘计算为例: 我们可以看出,递归就是在函数内部调用对自身的调用。 那么问题来了,我们知道在Javascript中,有一类函数叫做匿名函数,没有名称,怎么调用呢?当然你可以说,

  • 问题内容: 我有一个异步函数,要连续多次调用。问题是“多个”可以是几十万或数百万… 显而易见的方法是从回调中调用相同的函数,如下所示: 当然,涉及一些逻辑来停止递归。问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 问题答案: 问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 否。 如果调用回调是异步传递的,则不会堆积堆栈。 在您的代码中: 这是逐步发生的事情: 首先被称为。 然后

  • 第二个构造函数应该调用第一个构造函数,但却给了我“递归构造函数调用”错误。 我明白这个错误的意思,只是不明白递归在哪里。第一个contructor将作为参数,而应该是该类型的数组。我错过了什么? 多谢了。

  • 问题内容: 我是python(programming)的新手,我发现下面的递归程序很难遵循。在调试程序时,我发现每次递归时都会经历递归并且递减值-1。在某一点是-1,编译器移至该部分并返回0。 最终该值变为1,这是怎么发生的? 并输出: 递归示例结果 1 3 6 10 15 21 问题答案: 尝试用铅笔和纸追踪该功能。在这种情况下,该函数的打印语句可能会引起误解。 考虑一下程序的这一部分, 从这里

  • 本文向大家介绍详解Javascript函数声明与递归调用,包括了详解Javascript函数声明与递归调用的使用技巧和注意事项,需要的朋友参考一下 Javascript的函数的声明方式和调用方式已经是令人厌倦的老生常谈了,但有些东西就是这样的,你来说一遍然后我再说一遍。每次看到书上或博客里写的Javascript函数有四种调用方式,我就会想起孔乙己:茴字有四种写法,你造吗? 尽管缺陷有一堆,但Ja