当脚本执行时AJAX调用返回时,JavaScript会发生什么?
假设我写了一些JavaScript来执行AJAX调用,使用myCallback作为回调方法在AJAX成功时执行。
假设当我的异步调用myCallback时,在我的页面上调用一些叫做myFunction的JavaScript方法。 一个操作优先于另一个操作吗?它们是否同时运行?怎么了?
浏览器上的JavaScript是单线程的(禁止使用web workers,其语法是显式的)。所以myFunction将运行,直到它返回 – 与某些注意事项(继续阅读)。如果ajax层完成操作,而myFunction正在运行(这很可能),并需要调用回调,该调用会排队。下次你的代码产生时,队列中的下一个调用将被触发。 看来,我们从来不必担心种族状况。这是真的,但有一些微妙之处。例如,考虑这个代码: var img = document.createElement('img'); img.src = /* ...the URL of the image... */; img.onload = function() { // Handle the fact the image loaded foo(); }; doSomethingElse(); doYetAnotherThing(); 由于浏览器上的JavaScript是单线程的,我保证在图片加载时获取加载事件,对吧? 错误。 JavaScript代码是单线程的,但其余的环境可能不是。因此,可能发生的是,设置img.src后,浏览器可能会看到它具有可以使用的图像的缓存副本,因此它会在img之间触发img.src = …行之间的加载事件和img.onload = …行。因为我的处理程序还没有附加,我没有得到调用,因为当我附加我的处理程序时,事件已经触发。 但是你可以看到排队的效果,如果我们颠倒这些行: var img = document.createElement('img'); img.onload = function() { // Handle the fact the image loaded foo(); }; img.src = /* ...the URL of the image... */; doSomethingElse(); doYetAnotherThing(); 现在我挂钩事件之前设置src。如果事件在img.src = …行和doSomethingElse行之间触发(因为浏览器具有缓存中的图像),则对我的处理程序的回调会排队。 doSomethingElse和doYetAnotherThing在我的处理程序之前运行。只有当控制超出我的代码,排队的调用我的处理程序最终得到运行。 JavaScript代码是单线程的,但环境不是。 您还可以以非显而易见的方式向主机环境发送。例如,通过调用alert或其breathren确认,提示等。这些功能伸出像他们在现代JavaScript中的疼痛拇指,因为他们不是事件驱动;相反,当显示模态窗口时,JavaScript执行被暂停。但是作为bobince指出在his in-depth discussion here,这并不意味着没有你的其他代码将运行,而模态正在显示。它仍然是单线程的,但是一个线程被暂停在一个地方(通过模态),并用于在其他地方运行代码;一个非常精细的区别。 (Bob也指向一些事件处理 – 他的焦点例子 – 似乎打破了这个规则,但它不是。他的例子调用焦点,这反过来调用事件处理程序,然后返回;没有不同于你调用自己函数。)Bob指出的项目的关键点是,你的代码已经调用到主机环境中的东西,它会消失,并做某事(显示模态对话框,火灾模糊和焦点处理程序等)。 (警报和它的呼吸特别是导致各种各样的肮脏,特别是在焦点和模糊,我建议避免他们赞成更现代的技术(也可以看起来大约18倍更好)。) 所以这些是在答案开头提到的警告。特别是,如果myFunction调用alert,至少在Firefox上,ajax完成回调将在警报期间运行(在大多数其他浏览器上不会运行)。如果你想尝试在警报期间什么和不会发生,here’s a test page测试setTimeout和ajax;你可以扩展测试进一步。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |