【问题标题】:Javascript: recursive AJAX callbacks and maximum nesting levelJavascript:递归 AJAX 回调和最大嵌套级别
【发布时间】:2013-03-24 00:17:38
【问题描述】:

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

这是我的代码的一部分:

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

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

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

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

我用上千个请求测试了这个函数,所以嵌套层数大约是几千,但没有出现错误。是因为 JavaScript 中根本没有嵌套限制,还是因为我什么都不懂?

提前致谢。

【问题讨论】:

标签: php javascript ajax recursion


【解决方案1】:

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

所以在给定时间最多有一个updateForNextLecturer 在运行,并且根本没有嵌套函数调用,除了$.getJSON

这就是异步 JavaScript 的强大之处。当一切准备就绪时,事情就会发生。

奔跑的孩子类比

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

  • Ulec 向 Jason 提供了一些他想查询的信息
  • Jason 准备好后向 Ulek 提供信息。

现在 Ulec 开始他的任务。他给了杰森他的工作,杰森跑了。 Ulec 没有等待任何事情,Ulec 已经完成了他的工作,只是坐在那里,欣赏他的环境。他根本不工作。与此同时,Jason 获得了所有需要的信息,并将其与邮件一起发送回 Ulec。杰森也完成了他的工作。

一段时间后,Ulec 收到邮件并给 Jason 提供了另一份工作,直到他不再为 Jason 提供另一份工作。

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

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

【讨论】:

    猜你喜欢
    • 2014-04-10
    • 2012-02-21
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 2018-08-16
    • 2016-10-14
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多