JS是单线程的,但是执行异步任务又是谁去执行的呢?如果是客户端是谁去执行的呢?浏览器吗?如果是node服务端呢?
browser 里面通过 event loop 实现异步
每个页面里的 js runtime engine 都是单线程的,会挨个执行 stack 里面的的方法。
比如 ajax 发个请求,就会告诉浏览器去发,如果 stack 还有其他事儿,那就继续执行。
js 干他的事儿,浏览器新开线程去发 ajax,ajax respond 了,就把事件放到 callback queue 里面。
等 stack 事儿做完了,浏览器就 event loop,去执行 callback queue 里面的回调。这里面对不同的异步又有宏任务微任务的区别,但不影响你理解 js 如何实现异步。
在浏览器中js的异步任务,会被放入到任务队列中,同时很多异步行为,浏览器端会新开一个线程去完成。node的话看上面的大佬就可以了。浏览器的常见线程:GUI渲染线程、JS引擎线程、事件触发线程、定时触发器线程、异步http请求线程。
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
说下Node.js里面的单线程吧。
Node.js只有JS线程是单线程,底部有
libuv线程池
。比如我们使用
fs.readFile
读取文件时,JS
线程会向libuv线程池
提交任务并注册回调,做完这些之后JS线程继续轮询。libuv线程池
收到任务后取出任务执行,执行完毕后将数据通过回调函数来通知JS线程。在读取文件过程中的耗时操作(I/O)由
libuv线程池
执行,JS单线程并不去读文件我想浏览器中的JS也是一致的。比如你请求ajax的时候,任务提交完就是浏览器的事情了,浏览器把数据请求回来后通过回调
onload
来通知JS