js事件循环+promise

一、事件循环

!!!!!!事件循环其实就是:执行栈,宿主环境,事件队列3个之间的配合!!!!!!!!

js事件循环+promise

执行栈:call stack 是所有函数执行的一个环境,

只有执行栈里面空闲了,才去执行事件队列里面的事件。
JS引擎永远执行的是执行栈的最顶部
div.οnclick=function(){
.....
}
这个也是异步函数,只有等用户点击的时候,才去执行函数,这样的函数也叫异步函数,
某些函数不会立即执行,需要等到某个时机到达后才会执行,这样的函数称为异步函数,比如事件处理函数
异步函数的执行时机,会被宿主环境控制

浏览器宿主环境中包含5个线程:
1、JS引擎:负责执行执行栈的最顶部代码
2、GUI线程:负责渲染页面(div+css)
3、事件监听线程:负责监听各种事件(点击事件,鼠标移入事件,键盘点击事件)
4、计时线程:负责即时(settimeout等)
5、网络线程:负责网络通信(网络下载,ajax)

如果浏览器发现,上面的线程发生了某些事情,如果该线程发现,这件事情有处理程序,
它会将该处理程序加入到一个叫做事件队列的内存。当js引擎发现,执行栈中没有了任何内容后,会将

例子:js事件循环+promise

settimeout只是一个通知,瞬间就执行了,它通知宿主环境现在开始计时,计时完了等计时结束后(或者事件监听结束后),把函数丢到事件队列中排队等待执行。只有等执行栈里面的函数都执行完了,才去执行事件队列里面的函数,

js事件循环+promise

答案是先循环输出1...1000,然后输出time1- time3最后输出time2

我们把JS引擎对事件队列的取出执行方式,以及与宿主环境的配合,称之为事件循环。

问:js中有没有可能有一个函数,执行到一半的时候,被其他函数打断?

答:绝对不会,执行栈里面的函数没有执行完,绝对不会去执行事件队列里面的函数。这就是js的优势,js是不会被打断,js是单线程。

二、Promise

先来看一个回调地狱 js事件循环+promise

 

那么使用Promise能解决回调地狱吗?不能,Promise可以让这个回调更加规整,清晰容易理解,简化异步风格的代码

Promise对象表示任务,它用一种标准格式处理异步任务
Promise构造函数中传入的函数会被立即执行,Promise里面有个参数函数,参数函数里面有个resolve标记,
promise里面的事件完成了。那后续任务呢,怎么处理?它是把任务分开了,而不是写在Promise里面,它是用then去逐个调用

如下图的例子    js事件循环+promise

结果是     js事件循环+promise

 

最后:

事件队列在不同的宿主环境中有差异,大部分宿主环境会将事件队列进行细分。
在浏览器中,事件队列分为两种:
1/宏任务(队列)mactoTask  :计时器结束的回调、事件回调、http回调等绝大部分异步函数
2/微任务(队列)microTask :Promise产生的回调进入微队列

当执行栈清空时,JS引擎首先会将微任务中的所有任务依次执行结束,如果没有微任务则执行宏任务

综上所叙述,来完成下面的题目:

js事件循环+promise
 

答案是:C D F E A B (E是放进微队列,所以先执行E;A是最先放进宏队列里面的,所以先执行A 再执行B)