JS单线程与异步回调

JS是单线程的,但是执行异步任务又是谁去执行的呢?如果是客户端是谁去执行的呢?浏览器吗?如果是node服务端呢?

阅读 2.3k
3 个回答

说下Node.js里面的单线程吧。

clipboard.png

Node.js只有JS线程是单线程,底部有libuv线程池
比如我们使用fs.readFile读取文件时,JS线程会向libuv线程池提交任务并注册回调,做完这些之后JS线程继续轮询。
libuv线程池收到任务后取出任务执行,执行完毕后将数据通过回调函数来通知JS线程。
在读取文件过程中的耗时操作(I/O)由libuv线程池执行,JS单线程并不去读文件

我想浏览器中的JS也是一致的。比如你请求ajax的时候,任务提交完就是浏览器的事情了,浏览器把数据请求回来后通过回调onload来通知JS

browser 里面通过 event loop 实现异步

clipboard.png

每个页面里的 js runtime engine 都是单线程的,会挨个执行 stack 里面的的方法。
比如 ajax 发个请求,就会告诉浏览器去发,如果 stack 还有其他事儿,那就继续执行。
js 干他的事儿,浏览器新开线程去发 ajax,ajax respond 了,就把事件放到 callback queue 里面。
等 stack 事儿做完了,浏览器就 event loop,去执行 callback queue 里面的回调。这里面对不同的异步又有宏任务微任务的区别,但不影响你理解 js 如何实现异步。

在浏览器中js的异步任务,会被放入到任务队列中,同时很多异步行为,浏览器端会新开一个线程去完成。node的话看上面的大佬就可以了。浏览器的常见线程:GUI渲染线程、JS引擎线程、事件触发线程、定时触发器线程、异步http请求线程。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题