由于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是一个单线程,异步,非阻塞的i/o.我已经阅读了很多相关内容.例如,PHP每个请求使用一个线程,但节点只使用一个线程,就像那样.
假设在node.js服务器上有三个请求a,b,c同时到达.其中三个请求需要大量阻塞操作,例如,他们都想读取相同的大文件.
那么请求如何排队,执行阻塞操作的顺序以及调度响应的顺序是什么?当然使用了多少线程?
请告诉我三个请求的请求到响应的顺序.
假设我加载了一些我将来会知道将要调用window.flashReady并将设置的Flash影片window.flashReadyTriggered = true.
现在我有一段代码,我想在Flash准备就绪时执行.如果window.flashReady已经被调用,我希望它立即执行它,如果尚未调用它我想把它作为回调window.flashReady.天真的方法是这样的:
if(window.flashReadyTriggered) {
block();
} else {
window.flashReady = block;
}
Run Code Online (Sandbox Code Playgroud)
因此我基于此的关注是,if条件中的表达式被评估为false,但之后block()可以执行,window.flashReady由外部Flash触发.因此,block永远不会被称为.
是否有更好的设计模式来实现我想要的更高级别目标(例如,手动调用flashReady回调)?如果没有,我是安全的,还是我应该做的其他事情?
我是节点js和socket io的新手.此代码是否可以导致计数器变量的竞争条件.我应该使用锁定库来安全地更新计数器变量.
"use strict";
module.exports = function (opts) {
var module = {};
var io = opts.io;
var counter = 0;
io.on('connection', function (socket) {
socket.on("inc", function (msg) {
counter += 1;
});
socket.on("dec" , function (msg) {
counter -= 1;
});
});
return module;
};
Run Code Online (Sandbox Code Playgroud) javascript ×3
node.js ×2
asynchronous ×1
concurrency ×1
event-loop ×1
nonblocking ×1
settimeout ×1
socket.io ×1