gpt4 book ai didi

javascript - firebug (1.10.1) 建议 javascript 不局限于 firefox (13.0) 中的单个线程

转载 作者:行者123 更新时间:2023-11-29 22:22:07 25 4
gpt4 key购买 nike

今天在 Firefox 中调试一些客户端 javascript 时,我遇到了一些我觉得很奇怪而且有点不安的事情。此外,在使用 IE/VS2010 调试同一脚本时,我无法复制此行为。

我创建了一个简单的示例 html 文档来说明我所看到的异常情况。

<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js" type="text/javascript" ></script>
</head>

<body id="main_body">
<script type="text/javascript">
$(function () {
$(".test-trigger").on("click", function () {
loadStuff();
console && console.log && console.log("this will probably happen first.");
});
});

function loadStuff() {
$.get("http://google.com/")
.fail(function () {
console && console.log && console.log("this will probably happen second.");
});
}
</script>
<button class="test-trigger">test</button>
</body>
</html>

如果将此文档加载到 Firefox(我在 Windows 7 上使用 13.0 版和 Firebug 1.10.1 版),单击测试,然后在 Firebug 中查看控制台选项卡,您应该注意到获取请求失败(跨域违规)与我在这里要表达的观点无关),然后您很可能会看到:

this will probably happen first.
this will probably happen second.

现在,在第 13 行和第 20 行放置断点:

13: console && console.log && console.log("this will probably happen first.");
20: console && console.log && console.log("this will probably happen second.");

如果您再次单击测试,您将按预期在第 13 行中断。现在,恢复执行。如果你的经历和我一样,你不会在第 20 行中断。另外,如果你切换到控制台选项卡,你将看到以下日志输出序列:

this will probably happen second.
this will probably happen first.

对我来说,这表明 ajax 请求的失败处理程序正在一个线程中执行,而不是在执行单击处理程序的线程中执行。我一直被引导相信单个页面的所有 javascript 将在任何浏览器中由单个线程执行。我在这里错过了一些非常明显的东西吗?感谢您对此观察的任何见解。

哦,如果我使用 Visual Studio 调试在 IE 中运行的同一个页面,两个断点都会如我所料命中。

最佳答案

我认为可以安全地假设您观察到的异常是由 Firebug 如何实现断点/在引擎盖下工作引起的。我无法证实这一点。 OS X 上的 FF 14 也会发生这种情况。

除非 jQuery 立即执行您的 fail() 函数并超越整个 XMLHttpRequest 对象,否则 可以保证语句将是 this will probably happen first. 然后 this will probably happen second..

鉴于 JavaScript 的单线程特性,函数本质上是原子的;他们不会被回调打断。

您似乎在尝试模拟如果 click 函数在调用 loadStuff() 后需要一段时间才能完成执行会发生什么情况。 click 函数不应该 被执行的fail 方法打断(请注意 == 大吃一惊,您找到了实现此目的的方法)。

为了去除等式中的断点,这里有一个修改后的版本。其余标记保持不变。

$(function () {
$(".test-trigger").on("click", function () {
loadStuff();
for (var i = 0; i < 1000000000; i++)
{
//block for some interesting calculation or something
}
console && console.log && console.log("this will probably happen first.");
});
});

function loadStuff() {
$.get("http://google.com/")
.fail(function () {
console && console.log && console.log("this will probably happen second.");
});
}

在调用 loadStuff() 之后,click 函数显然需要很长时间才能执行,但控制台仍会在此处反射(reflect)日志语句的正确顺序。另外值得注意的是,如果插入相同的断点,排序将无效,就像原始示例一样。

我会 file an issue为此,请使用 Firebug。

关于javascript - firebug (1.10.1) 建议 javascript 不局限于 firefox (13.0) 中的单个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11802771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com