js异步原理
javascript引擎
javascript引擎执行时单线程的,如果有一个任务被阻塞,整个浏览器就会处于假死状态
那么遇到这种情况,又在单线程的情况下,不能像java之类的语言创建多几个线程来处理,如何解决呢,
js的异步处理就被提出来了
在执行javascript代码中,那些被javascript引擎认为是耗时任务的事件或者定时器,鼠标事件,ajax等,会被特殊处理
而其他的代码(同步代码)则被依次添加到主线程栈中,被javascript引擎依次执行。
那么那些被特殊处理的事件呢
定时器
在定时器被触发时,等到延迟结束,定时器的回调函数就会被添加到任务队列中,先后入队顺序根据延时时间长久
鼠标事件
在触发鼠标事件后,立即被添加进任务队列
ajax等异步请求
在网络请求成功后,回调函数才会被添加到任务队列
那么任务队列什么时候被处理呢
在主线程的同步代码被执行完毕,就会去任务队列查看有没有回调函数,有的话,就加载进入执行栈,开始执行
具体来说,异步运行机制如下:
(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制
reyirfw,追求无悔
每当你在感叹 如果有这样一个东西就好了的时候 请注意 其实这是你的机会