js编程-Promise详解

109 阅读3分钟

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 执行的是