Skip to content

Latest commit

 

History

History
83 lines (51 loc) · 3.09 KB

6.promise.md

File metadata and controls

83 lines (51 loc) · 3.09 KB

是ES6引入的新对象,是异步编程的一种解决方案。主要作用用来解决js异步机制里,回调机制产生的“回调地狱”。

Promise对象是一个构造函数,用来生成Promise实例,构造函数接受一个立即执行函数作为参数,该函数的两个参数分别为resolve和reject,用来改变Promise的状态。

状态不受外界影响,只有异步操作的结果,可以决定当前是哪一种状态。 状态一旦改变,就不会再变。只有两种可能:从pending变为fulfilled和从pending变为rejected。

无法取消也无法从外部观察到当前Promise的状态

  const promise = new Promise(function(resolve, reject) {});

作用: Promise封装了异步回调形式,让异步回调可以写的更加优雅,提高可读性。链式调用减低了编码难度

实例方法

  • then()

    状态发生变化时的回调函数,第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数

    then返回的是一个新的promise实例,使之可以链式调用

  • catch()

    1、可以说是then第二个回调函数(.then(null, rejection)或.then(undefined, rejection))的别名,用于指定发生错误时的回调函数。

    2、Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止

    3、Promise对象抛出的错误不会传递到外层代码,即不会有任何反应,try不写catch发生错误会影响后面的执行

  • finally()

    状态变化都会执行的操作

构造函数方法

  • all()

      Promise.all()方法用于将多个 Promise实例,包装成一个新的 Promise实例
      都为fulfilled返回值组成数组进入then第一个函数回调。
      只要有一个rejected,则进入失败回调。
      传入的实例如果定义catch捕获,不会触发Promise.all()的catch方法
    
  • race()

      race赛跑的意思。传入的promise实例数组哪个最快返回哪个,不管是什么状态
    
  • allSettled()

      传入的promise实例数组都返回结果才结束,不管是什么状态
    
  • resolve()

      // 等价于
      new Promise(resolve => resolve('foo'))```
    
    
  • reject()

      // 等价于
      new Promise(((resolve, reject) => resolve('出错了'))```
    
    

Promise构造函数是同步执行还是异步执行,那么 then 方法呢?

promise构造函数是同步执行的,then方法是异步执行的

reject 和 catch 处理上有什么区别

reject 是用来抛出异常,catch 是用来处理异常
reject 是 Promise 的方法,而 catch 是 Promise 实例的方法
reject后的东西,一定会进入then中的第二个回调,如果then中没有写第二个回调,则进入catch
网络异常(比如断网),会直接进入catch而不会进入then的第二个回调