gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:20:10 25 4
gpt4 key购买 nike

我无法理解为什么我的代码可以正常工作:)

这是我的代码的一部分:

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 中根本没有嵌套限制,还是因为我不明白某些东西?

提前致谢。

最佳答案

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

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

这就是异步 JavaScript 的力量。当一切准备就绪时,事情就会发生。

运行的子类比

假设您有两个 child ,Ulec 和 Jason。你给两个人一个任务:

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

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

过了一会儿,Ulec 收到了他的邮件,并为 Jason 提供了另一份工作,直到他不再为 Jason 提供另一份工作为止。

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

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

关于php - Javascript:递归 AJAX 回调和最大嵌套级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15768598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com