Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Javascript:递归AJAX回调和最大嵌套级别_Php_Javascript_Ajax_Recursion - Fatal编程技术网

Php Javascript:递归AJAX回调和最大嵌套级别

Php Javascript:递归AJAX回调和最大嵌套级别,php,javascript,ajax,recursion,Php,Javascript,Ajax,Recursion,我在理解代码正确工作的原因方面有问题:) 以下是我的代码部分: function updateForNextLecturer(current_id, all_lecturers, progressbar) { $.getJSON( '/' + root + 'custom/ajax/update_timetable_lecturer.php?id=' + all_lecturers[current_id], function(data) {

我在理解代码正确工作的原因方面有问题:)

以下是我的代码部分:

function updateForNextLecturer(current_id, all_lecturers, progressbar)
{
    $.getJSON(
        '/' + root + 'custom/ajax/update_timetable_lecturer.php?id=' + all_lecturers[current_id],
        function(data)
        {
            if (data.successfull == 0) {
                $.stickr({note: "Error occurred.", className: "classic error"});
                throw new Error("error");
            }

            else {
                percent = Math.round((current_id + 1) * 100.0 / all_lecturers.length);
                progressbar.progressbar({value: percent});

                if (current_id + 1 < all_lecturers.length)
                    updateForNextLecturer(current_id + 1, all_lecturers, progressbar);
                else 
                    $.stickr({note: "Success", className: "classic"});
            }
        }
    );
}
我用数千个请求测试了这个函数,因此嵌套级别大约为数千,但没有发生错误。这是因为JavaScript中根本没有嵌套限制,还是因为我不懂什么


提前感谢。

这不是真正的递归
updateFornext讲师
将在
$.getJSON
之后退出。请求完成后,将调用匿名函数。这是主循环的一部分,主循环处理所有事件,包括匿名回调函数的执行

因此,在给定的时间内最多运行一个
updateFornext讲师
,除了
$.getJSON
之外,没有任何嵌套函数调用

这就是异步JavaScript的强大功能。事情可以在他们准备好的时候发生

跑步儿童类比 假设你有两个孩子,尤利克和杰森。你给两个人一个任务:

  • Ulec给了杰森一些他想查询的信息
  • 杰森准备好后给乌莱克信息
现在,Ulec开始他的任务。他把工作交给了杰森,杰森就跑了。Ulec不等待任何事情,Ulec已经完成了他的工作,只是坐在那里,欣赏他的环境。他根本不工作。同时,Jason获得了所有需要的信息,并将其和邮件一起发送回Ulec。杰森也完成了他的工作

过了一会儿,Ulec收到了他的邮件,给了杰森另一份工作,直到他再也没有其他工作给杰森了

在本例中,Ulec是
updateFornext讲师
,而Jason是
$.getJSON
。邮件实际上是ajax请求成功后的一小段等待时间,是主循环中的事件处理


这与递归调用有很大区别。在这种情况下,Ulec会给自己一份工作,或者克隆自己给自己一份工作。但是克隆工作不会持续太久,记住他需要做的所有工作也不会太久。

这不是真正的递归
updateFornext讲师
将在
$.getJSON
之后退出。请求完成后,将调用匿名函数。这是主循环的一部分,主循环处理所有事件,包括匿名回调函数的执行

因此,在给定的时间内最多运行一个
updateFornext讲师
,除了
$.getJSON
之外,没有任何嵌套函数调用

这就是异步JavaScript的强大功能。事情可以在他们准备好的时候发生

跑步儿童类比 假设你有两个孩子,尤利克和杰森。你给两个人一个任务:

  • Ulec给了杰森一些他想查询的信息
  • 杰森准备好后给乌莱克信息
现在,Ulec开始他的任务。他把工作交给了杰森,杰森就跑了。Ulec不等待任何事情,Ulec已经完成了他的工作,只是坐在那里,欣赏他的环境。他根本不工作。同时,Jason获得了所有需要的信息,并将其和邮件一起发送回Ulec。杰森也完成了他的工作

过了一会儿,Ulec收到了他的邮件,给了杰森另一份工作,直到他再也没有其他工作给杰森了

在本例中,Ulec是
updateFornext讲师
,而Jason是
$.getJSON
。邮件实际上是ajax请求成功后的一小段等待时间,是主循环中的事件处理


这与递归调用有很大区别。在这种情况下,Ulec会给自己一份工作,或者克隆自己给自己一份工作。但是克隆不会工作太久,记住他需要做的所有作业也不会太久。

虽然此特定示例不会溢出堆栈,因为异步回调总是在新堆栈上执行,。而此特定示例不会溢出堆栈,因为异步回调总是在新堆栈上执行。
Fatal error: Maximum function nesting level of '100' reached, aborting!