由于JavaScript在单个线程中运行,在发出AJAX请求后,后台实际发生了什么?我想更深入地了解这一点,任何人都可以解释一下吗?
我在事件循环中读过几个帖子/ SO线程,根据MDN的文章,
当堆栈为空时,将从队列中取出一条消息并进行处理.
作为一个JS新手,我仍然感到困惑的是 - 什么时候调用堆栈变得"空"?例如,
<script>
function f() {
console.log("foo");
setTimeout(g, 0);
console.log("foo again");
}
function g() {
console.log("bar");
}
function b() {
console.log("bye");
}
f();
/*<---- Is the stack empty here? */
b();
</script>
Run Code Online (Sandbox Code Playgroud)
正确的执行顺序是foo- foo again- bye- bar.
但是今天我开始思考:退出f()电话后,技术上的堆栈是不是很空?我的意思是在那一点上我们不在任何函数内部,并且我们还没有开始任何新的执行,所以不应该处理setTimeout调用消息(已经立即排队),然后继续执行b(),并给出顺序foo- foo again- bar- bye?
如果我们有一百万行代码或一些密集计算要执行并且setTimeout(func, 0)只是在队列中停留多长时间怎么办?
以下示例在Node.js书中给出:
var open = false;
setTimeout(function() {
open = true
}, 1000)
while (!open) {
console.log('wait');
}
console.log('open sesame');
Run Code Online (Sandbox Code Playgroud)
作者解释说明while循环阻止执行的原因:
Node永远不会执行超时回调,因为事件循环停留在第7行的while循环中,永远不会让它有机会处理超时事件!
但是,作者没有解释为什么会在事件循环的上下文中发生这种情况或者真正发生在幕后的事情.
有人可以详细说明吗?节点为什么会卡住?如何更改上面的代码,同时保留while控制结构,以便不阻止事件循环,并且代码将按照人们可能合理预期的方式运行; 等待将在setTimeout火灾前记录仅1秒,然后在记录"打开芝麻"后退出该过程.
关于IO和事件循环和回调这个问题的答案等通用解释并没有真正帮助我理解这一点.我希望直接引用上述代码的答案会有所帮助.
或ecmascript但我想知道它是如何实际发生的更多取决于确切的实施.
javascript在技术上是单线程的.
但如果我做的事情
$myDIv.animate({
height:"100px"
});
Run Code Online (Sandbox Code Playgroud)
如果我这样做会有什么不同吗?
一个.
$myDIv.animate({
height:"100px"
}, null, my_cpu_heavy_function);
Run Code Online (Sandbox Code Playgroud)
或B.
$myDIv.animate({
height:"100px"
});
my_cpu_heavy_function();
Run Code Online (Sandbox Code Playgroud)
因为在第二个动画中,动画会用cpu重函数来处理时间,因此动画的外观会受到影响,对吧?
那么,Javascript在同步代码块的末尾停止执行,还是在任何随机点切断一个块以允许另一个异步运行的块被处理?
javascript ×4
asynchronous ×1
concurrency ×1
ecma262 ×1
event-loop ×1
node.js ×1
settimeout ×1