Promise和异步机制
异步机制
JavaScript的异步机制是事件轮询。
- Js引擎发起的任务是微任务
- 宿主(浏览器)发起的任务是宏任务
下面这张图大概阐述了哪些是宏任务哪些是微任务,都是我们比较常用的。比如,promise是微任务,setTimeOut是宏任务。
- 所有同步任务都先在操作系统主线程上执行,主线程空了就访问宏任务队列
- 主线程执行一个宏任务后先访问微任务队列
- 微任务队列空了再访问下一个宏任务
- 下一个宏任务被放到主线程上执行,回到第二点
所以,宏任务需要多次事件循环才能执行完,微任务是一次性执行完的
Promise
特点:
- Promise不返回真实结果,而返回一个承诺,由then来执行回调。
- Promise的状态一旦发生改变就无法更改(resolve或者reject)
- Promise的then方法的参数期望是函数,传入非函数则会发生值穿透(寻找下一个传值正常的then)
- Promise的回调是同步的,而then的回调是异步的
- 链式调用then,上一个then的返回值是下一个then接受的参数;如果返回错误,会返回一个状态为reject的Promise
- then的回调里return一个promise会进入等待状态,直到return的Promise改变
关于上述最后两点,then会return一个Promise,返回结果会被下一个then接收,所以可以链式调用。如果抛出错误,就直接被catch接收。如果手动返回一个Promise,就等待这个Promise状态发生改变,然后继续执行下一个then。
因此我们有了手写promise的思路:
用then来注册回调函数,用resolve去执行回调。
实现所需:status状态量,回调队列,value,resolve函数,reject函数