当前位置: 首页 > 面试题库 >

在脚本执行过程中返回AJAX调用时,在JavaScript中会发生什么?

游勇军
2023-03-14
问题内容

假设我编写了一些执行AJAX调用的JavaScript,并将其myCallback作为一种回调方法在AJAX成功时执行。

假设异步myFunction调用时在我的页面上调用了其他一些JavaScript方法myCallback

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


问题答案:

假设异步myFunction调用时在我的页面上调用了其他一些JavaScript方法myCallback

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

浏览器上的JavaScript是单线程的(除非使用web
worker
,否则其语法是明确的)。因此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是单线程的,因此可以保证load在加载图像时触发该事件,对吗?

错误。

的JavaScript
代码是单线程的,但环境的其余部分可能不是。因此,可能会发生这样的情况:设置了img.src,浏览器可能会看到它具有可以使用的图像的缓存副本,因此会触发该行与该行
之间load事件。由于尚未附加我的处理程序,因此无法接听电话,因为在附加我的处理程序时,该事件已经触发。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行之间触发(因为浏览器将图像保存在缓存中),则对我的处理程序的回调将 排队
doSomethingElsedoYetAnotherThing在我的处理程序之前运行。只有当控制权从我的代码传递出去时,对我的处理程序的排队调用才最终运行。JavaScript代码是单线程的,但环境不是。

您还可以采用非显而易见的方式屈服于主机环境。例如,通过调用alert或其breathren
confirmprompt等等。这些功能坚持像疮大拇指,他们是现代的JavaScript,因为他们 不是 事件驱动;
而是在显示模式窗口时暂停JavaScript执行。但是正如bobince在这里的深入讨论中指出的那样,这并不意味着在显示该模式时您的其他任何代码都不会运行。它仍然是单线程的,但是一个线程被挂在一个地方(通过模式),​​并同时用于在其他地方运行代码。确实是非常好的区别。(鲍勃还指出了一些事件处理方法-
他的focus例如-似乎违反了此规则,但事实并非如此。他的示例 调用
focus,依次调用事件处理程序,然后返回;与Bob指出的项目的共同点是,您的代码已在宿主环境中调用了某个东西,该东西会消失并执行某些操作(显示模式对话框,触发blurfocus处理程序)等)。

alert尤其是它的呼吸会引起各种各样的麻烦,尤其是在focus和周围blur,我建议您避免使用它们,而应使用更现代的技术(看起来也要好18倍左右)。)

因此,这些是答案开头提到的警告。特别是,如果myFunction调用alert,至少在Firefox上,ajax完成回调
在期间运行alert(在大多数其他浏览器上不会)。如果您想知道在alerts这样的情况下会发生什么和没有发生什么,这里有一个测试页测试setTimeout和ajax;您可以扩展测试以进一步进行。



 类似资料:
  • 问题内容: 我正在显示项目ID和标题。还有一个链接“显示此成员的项目”。单击它会显示该用户的项目。为此,我使用ajax。有一个脚本可以检测单击复选框。此选项对于第一个列出的项目正常工作,但对ajax返回的项目无效 脚本代码和ajax是 getdetails.php代码是 问题答案: 使用此脚本

  • 问题内容: 我正在发送一个jQuery get请求,如下所示: 我希望收到的响应将包装在脚本标签中。 我了解浏览器不会执行响应,除非返回的返回结果没有脚本标签。通常,我会从响应中删除标签,但是在这种情况下,我无权访问在远程计算机上运行的代码,因此无法从源代码剥离标签。 有没有办法我可以从响应客户端剥离脚本标签并执行javascript? 问题答案: 您应该能够执行以下操作:

  • 问题内容: 我使用$ .ajax()每5秒轮询一次操作方法,如下所示: 和ActionResult动作: 为了使用RedirectToAction,我不得不将操作返回类型更改为ActionResult(最初是JsonResult,而我正在返回),但是从$ .ajax()成功回调中重定向和呈现新的View看起来很麻烦。我需要从此轮询ajax回发中重定向到“ AnotherAction”。Firebu

  • 问题内容: 我使用jQuery的.load函数将一些HTML代码加载到div中,其中包含要执行的一些代码; 加载ajax请求后,alert(); 函数起作用,但是someFunction无法起作用。 如何从Ajax调用执行此功能 执行的功能也不起作用。 问题答案: 可能您应该使用jQuery.getScript从服务器加载一些javascript并执行它。 更新: 在大多数情况下,仅加载纯HTML

  • 问题内容: 想象一下,一个需要花费很长时间才能运行的python脚本,如果我在运行时对其进行修改,会发生什么?结果会有所不同吗? 问题答案: 没什么,因为Python将您的脚本预编译为PYC文件并启动它。 但是,如果发生某种异常,您可能会得到有点误导的解释,因为 X 行的代码可能与启动脚本之前的代码不同。

  • 问题内容: 在某个线程上调用an 时,该线程会发生什么? 问题答案: 目标线程是“中断的”。通常,在该线程中设置一个标志,该线程可以查看该标志(带有)。如果目标线程当前在某些I / O上被阻塞,则分别使用an 或an 唤醒它。 线程中断是微调线程的一种温和方法。它是用来给线程有机会退出 干净 ,而不是,这更像是一支突击步枪射击的线程。