优点
1.Promise 是一种封装和组合未来值得易于复用机制,实现关注点分离、异步流程控制、异常冒泡、串行/并行控制等
2.Promise会做出正确延时或异步操作,会解决callback处理异步回调可能产生的调用过早,调用过晚、调用次数过多过少、吞掉可能出现的错误或异常问题等,只接受首次 resolve(…)或 reject(…) 决议,本身状态转变后不会再变,所有通过 then(…) 注册的回调总是依次异步调用,所有异常总会被捕获抛出
then 回调异步执行
1)Promise 实例化时传入的函数会立即执行,then(…) 中的回调需要异步延迟调用
2)回调函数异步调用时机:可以理解为onFulfilled 或 onRejected 只在执行环境堆栈仅包含平台代码时才可被调用
3)实践中要确保 onFulfilled 和 onRejected 方法异步执行,且应该在 then 方法被调用的那一轮事件循环之后的新执行栈中执行,这个事件队列可以采用宏任务 macro-task机制或微任务 micro-task机制来实现
4)在ES6中,Promise 必须以 Promise Job 形式加入 job queues,也就是微任务micro-task。
Promise 状态
1)Promise 的三种状态:等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)。一旦Promise被resolve或reject,不能再迁移至其他任何状态(即状态 immutable)
2)fulfilled 使用 resolved 代替,onFulfilled 使用 onResolved 代替
链式调用的promise
1)为保证 then 函数链式调用,then 需要返回 promise 实例
2) Promise 状态一旦 resolved 或 rejected就不能再迁移
3)handleResolved 函数功能为根据当前 promise 状态,异步执行 onResolved 或 onRejected 回调函数,因在 resolve 或 reject 函数内部同样需要相关功能,提取为单独模块
reject 函数
1)Promise 内部私有方法 reject 相较于 resolve 逻辑简单很多
2)resolve函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去
reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去
reject 和 catch 的区别
1)promise.then(onFulfilled, onRejected)在onFulfilled中发生异常的话,在onRejected中是捕获不到这个异常的
2)promise.then(onFulfilled).catch(onRejected) .then中产生的异常能在.catch中捕获
3)建议使用第二种,因为能捕获之前的所有异常
4)第二种的.catch()也可以使用.then()表示,它们本质上是没有区别的,.catch === .then(null, onRejected)
Promise的事件循环
1)Promise在初始化时,传入的函数是同步执行的,然后注册 then 回调。注册完之后,继续往下执行同步代码,在这之前,then 中回调不会执行。同步代码块执行完毕后,才会在事件循环中检测是否有可用的 promise 回调,如果有,那么执行,如果没有,继续下一个事件循环