请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

对于挂起的异步任务执行的问题

我对于js异步的执行机制算是差不多清楚的,但是我一直有个疑惑,当js主线程执行到异步任务,将异步任务挂起之后,是在哪里执行这些异步任务的准备过程呢?(比如定时器的计时,网络请求的过程),因为异步任务需要准备就绪之后再添加到消息队列等待事件循环去执行,那么异步任务准备就绪这个过程,是谁在执行,js不是是单线程嘛。
我的理解是js执行引擎是单线程的,但是定时器和网络请求或者一些webApi这些异步任务,是交给Node环境或是浏览器的其他线程做的,然后其他线程完成这些异步任务的准备工作后,再将这个任务返回添加到js执行引擎的消息队列中。

正在回答 回答被采纳积分+3

1回答

双越 2020-06-10 14:09:27

js 代码是单线程执行,但 js 引擎可不是单线程的。这一点你要搞明白。

1 回复 有任何疑惑可以回复我~
  • 提问者 godlanbo #1
    我在网上搜罗大量资料,大部分都表明,js解析器也就是js引擎就是单线程的,附着于浏览器的渲染进程中,定时器的计时和网络请求也是挂起给渲染进程中的定时器线程和网络请求线程处理,最后处理完后交给事件触发线程给js引擎处理。
    如果有我没了解到的地方,还望老师补充。
    回复 有任何疑惑可以回复我~ 2020-06-11 08:54:43
  • 双越 回复 提问者 godlanbo #2
    你既然提到了定时器线程、网络请求线程,那说明你已经搞懂了自己的问题了。
    
    我再补充一点。Promise 这种微任务的异步,是不是 js 引擎来搞定的?
    回复 有任何疑惑可以回复我~ 2020-06-11 11:18:04
  • 提问者 godlanbo 回复 双越 #3
    以我的理解,微任务应该是js引擎做的。
    首先微任务应该是在上一个宏任务执行过程中被创建放入微任务队列,在下一次宏任务执行前被清空。
    用Promise来举例,对于.then这个异步微任务,就绪步骤就是resolve,也就是说他是出于等待状态的异步任务,而不是定时器和网络请求那种异步执行的任务。resolve是在宏任务中被执行,那么也就是说.then这个微任务在宏任务中被创建,被触发,被执行。
    所以Promise这种微任务的异步应该是js引擎在搞。
    如果有理解错误,望老师补充。
    回复 有任何疑惑可以回复我~ 2020-06-11 12:28:53
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信