加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

当脚本执行时AJAX调用返回时,JavaScript会发生什么?

发布时间:2020-12-16 03:19:39 所属栏目:百科 来源:网络整理
导读:假设我写了一些JavaScript来执行AJAX调用,使用myCallback作为回调方法在AJAX成功时执行。 假设当我的异步调用myCallback时,在我的页面上调用一些叫做myFunction的JavaScript方法。 一个操作优先于另一个操作吗?它们是否同时运行?怎么了? Suppose then t
假设我写了一些JavaScript来执行AJAX调用,使用myCallback作为回调方法在AJAX成功时执行。

假设当我的异步调用myCallback时,在我的页面上调用一些叫做myFunction的JavaScript方法。

一个操作优先于另一个操作吗?它们是否同时运行?怎么了?

Suppose then that some other JavaScript method called myFunction is being invoked on my page when myCallback is invoked asynchronously.

Does one operation take precedence over the other? Do they both run at the same time? What happens?

浏览器上的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;你可以扩展测试进一步。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读