Promise

  1. ES6引入的异步编程的新方案,语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果

    Promise状态

  2. 待定pending:初始状态,没有被兑现,也没有被拒绝

  3. 已兑现 fulfilled:操作完成
  4. 已拒绝 rejected:操作失败
  5. promise的构造函数接受一个参数,是回调函数,并且回调函数接受两个参数,resolve,reject,分别表示异步操作执行成功后的回调函数和失败后的回调函数
  6. new Promise()函数是同步执行的,只是用来处理异步
  7. Promise的实例化对象有两个属性 PromiseSata属性:当前Promise实例化对象的状态 ,PromiseResult:当前Promise实例化对象的值

    1. //初始化状态(默认,异步代码还在执行中)
    2. const promise = Promise((resolve,reject)=>{
    3. //同步调用
    4. //执行异步操作/异步代码
    5. setTimeout(()=>{
    6. console.log('setTimeout');
    7. },1000);
    8. })
    9. console.log(promise);
    1. //异步代码执行成功了
    2. //调用resolve函数,可以将promise实例的状态由pending变成resolved,成功的promise实例的值为resolve的参数
    3. const promise = new Promise((resolve,reject)=>{
    4. set Timeout(()=>{
    5. resolve('a数据');
    6. },1000)
    7. })
    8. console.log(promise)
    1. //失败状态,调用reject函数,将实例状态由pending变成rejected,失败的promise实例的值为resolve的参数
    2. const promise = new Promise((resolve,reject)=>{
    3. set Timeout(()=>{
    4. console.log('setTimeout');
    5. reject('失败');
    6. },1000)
    7. })
    8. console.log(promise)

    Promise的then方法

  8. Promise.prototype.then,接受两个回调函数作为参数,捕获promise成功或失败的状态,执行成功或失败的回调,成功跟失败的回调函数返回promise实例的值

  9. then方法的回调函数是异步的,当调用then的实例化的promise实例不再是pending状态时,会执行then中的对应的成功或失败的回调函数
  10. then方法一定返回的是promise对象

    then返回值

    成功的promise实例调用then方法时

  11. 默认:then返回的是一个成功的promise实例,promise实例的值就是当前回调函数的返回值

  12. 当then中返回的是一个promise实例的时候,then返回的promise实例的状态和值就是回调函数返回的promise实例的状态和值
  13. 当then的回调函数内部出现报错并没有异常处理,则直接then返回失败的promise实例,值为这个错误
  14. then中只传递一个值,会直接发生值穿透,then返回成功状态depromise实例,值是调用then的promise实例的值

失败的promise实例调用then方法

  1. 当then中没有书写关于失败的回调函数的时候,会发生值穿透,直接返回失败,值为调用catch的失败的promise实例的值

成功的promise对象调用catch方法

  1. catch直接返回一个成功的的promise对象,并且值是调用catch的那个成功的promise对象的值

    1. const promise = new Promise((resolve,reject)=>{
    2. setTimeout(()=>{
    3. console.log('setTimeout()');
    4. resolve('a数据');
    5. },1000)
    6. });
    7. promise.then((result)=>{
    8. //成功的回调
    9. //当promise对象的状态变成resolved,就会执行当前函数
    10. return 'then';
    11. },(error)=>{
    12. //失败的回调
    13. //当promise对象状态变成rejected,就会执行当前函数
    14. console.log(error);
    15. })

    Promise的catch方法

  2. Promise.prototype.catch可以接受一个回调函数作为参数,捕获promise失败的状态,执行的回调

  3. 规则和then方法中的第二个回调函数一致
  4. 成功的promise对象调用catch方法,catch直接返回一个成功的promise实例,并且值是调用catch那个成功的promise实例的值

    Promise的finally方法

  5. 无论promise实例是否成功失败,都会进入finally中执行

  6. finally的回调函数不接受参数

finally返回值

  1. 当finally中的回调函数返回的是失败的pomise对象时,finally返回失败的promise对象,值为回调函数返回promise对象的值
  2. 当finally的回调函数中出现报错,则finally直接返回失败的promise对象,值为错误信息
  3. 其他情况一律认为类似穿透
    1. const promise = new Promise((resolve,reject)=>{
    2. });
    3. //promise变成成功/失败都出发。pending不触发
    4. promise.finally(()=>{
    5. console.log('finally');
    6. })

    Promise静态方法

    1. Promise.all([promise1,...])
    2. //接收一个promise的iterable(Array,Map,Set都属于es6的iterable类型)类型的输入
    3. //并且只返回一个Promise实例,那个输入的所有promise的resolve回调的结果时一个数组
    4. //这个Promise的resolve回调执行时在所有输入的promise的resolve回调都结束,或者输入的iterable里没有promise了的时候
    5. //它的reject回调执行的是,只要任何一个输入的promise的reject回调执行或者输入不合法的promise就会立即抛出错误,并且reject的时第一个抛出的错误信息
    1. //返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果
    1. //返回一个promise,一旦迭代器中的某个promise解决或拒绝,返回的promise就会解决或拒绝
    1. //接收一个promise可迭代对象,只要其中的一个promise成功,就返回那个已经成功的promise,如果一个都不成功,就返回一个失败的promise和AggregateError类型的实例
    1. //快速得到一个成功状态的promise对象,值为value
    2. //如果value是一个对象,resolve方法返回的promise的状态跟值随内部value的状态和值
    1. //快速得到一个失败状态的promise对象,值为value
    2. //不管value是什么对象,都是这个失败的promise对象的值