我有一个理解上的问题,为什么我的代码可以正常工作:)

这是我的代码的一部分:

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"});
            }
        }
    );
}


需要此代码来更新所有讲师的时间表。
请求是异步的,并且一个接一个地进行,因此Web服务器的负载不大。

为了使请求接连进行,我需要使用递归回调(我想这是唯一的解决方案)。问题是-为什么这可以正常工作,难道没有像PHP那样的最大嵌套级别?
在PHP中,您会收到以下错误

Fatal error: Maximum function nesting level of '100' reached, aborting!


我用数千个请求测试了此功能,因此嵌套级别约为数千,但没有发生错误。那是因为JavaScript中根本没有嵌套限制,还是因为我不了解某些内容?

提前致谢。

最佳答案

它不是真正的递归。 updateForNextLecturer将在$.getJSON之后退出。请求完成后,将调用您的匿名函数。这是在处理所有事件(包括执行匿名回调函数)的主循环中发生的。

因此,在给定的时间最多有一个updateForNextLecturer运行,除了$.getJSON之外根本没有嵌套函数调用。

这就是异步JavaScript的功能。准备就绪时,事情可能会发生。

运行孩子类比

假设您有两个孩子,Ulec和Jason。您同时给两个任务:


Ulec为Jason提供了一些他想查询的信息
杰森准备好后,会给他提供信息。


现在,Ulec开始他的任务。他将自己的工作交给了杰森,杰森也因此离职。 Ulec无需等待,Ulec完成了他的工作,只是坐在那里,欣赏他的环境。他根本不工作。同时,Jason获取了所有需要的信息,并将其与邮件一起发送回Ulec。杰森也完成了他的工作。

过了一会儿,Ulec收到了邮件,给了Jason另一份工作,直到他再也没有Jason的工作为止。

在此示例中,Ulec是updateForNextLecturer,而Jason是$.getJSON。邮件实际上是ajax请求成功后的等待时间,事件在主循环中处理。

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

08-07 08:32