1、Promise ES6新增的类,一种承诺模式,有效管理js中的异步编程。可以解决异步编程中产生的回调“地狱”;
let p1 = new Promise();
// 要求new Promise 必须传递函数【executor】才可以
// Promise.resolve: 创建一个返回成功的Promise实例;
// Promise.reject: 创建一个返回失败的Promise实例;
// 执行.then返回一个全新的Promise实例;
// 对于失败的promise实例,如果没有编写方法处理结果,则会在控制台抛出异常信息【但是不会阻碍其他代码的执行】
// 在.then 注入方法的时候,如果其中的某个方法没有传递,则会顺延下一个then中具备相同状态需要执行的函数上。
// then(null, reason => { ...}) 用catch(reason => {....})来代替;
2、new Promise的时候
+会立即执行传递的executor函数;
-
在executor函数中一般用来管控的异步的操作(不写异步的也可以);
-
而且传递给executor俩个参数:resolve, reject 也是俩个函数
-
创造一个Promise类的实例
-
[[PromiseState]] promise状态: pending 准备状态 fulfilled/resolved 成功 (已兑现)rejected 失败(已拒绝)
-
[[PromiseResult]] promise值: 默认是undefined, 一般存储成功的结果或者失败的原因;
-
p1.**proto** -> Promise.prototype: then/catch/finally
执行resolve控制实例的状态变为成功
执行reject控制实例的状态变为失败
如果executor中的代码执行报错,则实例的状态也变为失败,并且[[PromiseResult]]是报错的原因
状态一旦从pedding变为fulfilled或rejected,都无法再次改变状态
3、Promise是如何管控异步编程的?
-
new Promise的时候创建一个promise实例,此时在executor函数中管控一个异步的代码;
-
后期等异步编程返回成功或者失败,执行resolve/reject, 以此来控制promise的状态和结果;
-
根据状态和结果,可以控制.then注入的俩个方法中的哪一个执行
-
不论是否基于.then注入方法,执行resolve/reject的时候“修改状态和值”是同步的【立即处理】,但是“通知对应注入方法执行”的这个任务是异步操作的,【不会立即处理,只是把它排到等待任务队列中,当其他事情处理完,再次返回,通知对应的方法执行】
4、Promise实例状态和值的分析
第一种情况:new Promise出来的实例
- resolve/reject 的执行控制其状态[[PromiseState]]和值[[PromiseResult]];
+executor函数执行失败控制其[[PromiseState]] = 'rejected' & [[PromiseResult]] = '程序报错的原因'
第二种情况:.then 返回的新实例
+then注入的俩个方法,不论哪个方法执行,只要执行不报错,新实例的状态都是fulfilled;只要执行报错,新实例的状态就是rejected;并且新实例的[[PromiseResult]]是方法返回的值;
- 但是如果方法返回的是一个新的Promise实例,则此实例最后的成功或失败,直接决定.then 执行的是