我有一个理解问题,为什么我的代码正常工作:)
以下是我的代码部分:
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根本没有嵌套限制,或者因为我不了解某些内容?
提前致谢。
答案 0 :(得分:1)
这不是真正的递归。 updateForNextLecturer
将在$.getJSON
之后退出。请求完成后,将调用匿名函数。这发生在主循环的一部分,主循环处理所有事件,包括执行您的匿名回调函数。
因此除了updateForNextLecturer
之外,最多只有一个$.getJSON
在给定时间运行,并且根本没有嵌套函数调用。
这是异步JavaScript的强大功能。当他们准备好时,事情就会发生。
假设你有两个孩子,Ulec和Jason。你给两个任务:
现在Ulec从他的任务开始。他给了Jason他的工作和Jason的工作。 Ulec没有等待任何事情,Ulec完成了他的工作,只是坐在那里,欣赏他的环境。他根本不工作。与此同时,Jason获得了所有需要的信息,并将邮件发送回Ulec。杰森也完成了他的工作。
过了一会儿,Ulec收到了他的邮件并给了Jason另一份工作,直到他再也没有为Jason工作了。
在这个例子中,Ulec是updateForNextLecturer
,而Jason是$.getJSON
。邮件实际上是ajax请求成功后的小等待时间,主循环中的事件处理。
这对递归调用有很大的不同。在这种情况下,Ulec会给自己一份工作,或克隆自己给自己一份工作。但克隆不会持续太长时间,也不记得他需要做的所有工作。