假设我编写了一些执行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
行之间触发(因为浏览器将图像保存在缓存中),则对我的处理程序的回调将 排队
。doSomethingElse
并doYetAnotherThing
在我的处理程序之前运行。只有当控制权从我的代码传递出去时,对我的处理程序的排队调用才最终运行。JavaScript代码是单线程的,但环境不是。
您还可以采用非显而易见的方式屈服于主机环境。例如,通过调用alert
或其breathren
confirm
,prompt
等等。这些功能坚持像疮大拇指,他们是现代的JavaScript,因为他们 不是 事件驱动;
而是在显示模式窗口时暂停JavaScript执行。但是正如bobince在这里的深入讨论中指出的那样,这并不意味着在显示该模式时您的其他任何代码都不会运行。它仍然是单线程的,但是一个线程被挂在一个地方(通过模式),并同时用于在其他地方运行代码。确实是非常好的区别。(鲍勃还指出了一些事件处理方法-
他的focus
例如-似乎违反了此规则,但事实并非如此。他的示例 调用
focus
,依次调用事件处理程序,然后返回;与Bob指出的项目的共同点是,您的代码已在宿主环境中调用了某个东西,该东西会消失并执行某些操作(显示模式对话框,触发blur
和focus
处理程序)等)。
(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 唤醒它。 线程中断是微调线程的一种温和方法。它是用来给线程有机会退出 干净 ,而不是,这更像是一支突击步枪射击的线程。