关于promise的一些问题

569 阅读5分钟

promise是什么?

  1. promise是异步编程的一种解决方案
  2. promise简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步的操作)结果
  3. 从语法上说,promise是一个对象,从它可以获取异步操作的信息

为什么使用promise

  1. 解决回调地狱
  2. 为了我们的代码更加具有可读性和维护性,需要将数据请求与数据处理明确的区分开来

   关于回调地狱

         在JavaScript的世界中,所有代码都是单线程执行的,由于这个缺陷,导致jjavascript的所有网络操作,浏览器事件,都必须是异步执行,异步执行可以用回调函数实现。异步操作会在将来的某个时间点触发一个函数调用,ajxa就是典型的异步操作。 调用ajax请求的时候难免会遇到一个接口需要另一个接口的数据来获取,往往我们会直接将那个接口直接写在上一个接口的回调函数里,但是它增加了函数的嵌套深度也会造成一定的逻辑混乱,如果多几个接口嵌套就比较糟心了,这就是回调地狱。而promise的出现就是为了解决万恶的回调函数的!

promise的特点

1. 对象的状态不受外界影响

        promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(以失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其它操作都无法改变这个状态。这也是promise这个名字的又来,它的英语意思就是“承诺”,表示其它手段无法改变。

2. 一旦状态改变,就不会在变,任何时候都可以得到这个结果

      promise对象的状态改变,只有两种可能,从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会在变了。会一直保持这个结果,这时就成为resolved(已定型)。如果改变已经发生了,你在对promise对象添加回调函数,也会立即得到这个结果。这与事件(event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

promise的优点

       有了promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,promise对象提供统一的接口,使得控制异步操作更加容易。

      1. promise是一个对象,对象和函数的区别就是对象可以保存状态,函数不可以(闭包除外)

      2. 并未剥夺函数return的能力,因此无需层层传递callback,进行回调获取数据

      3. 代码风格容易理解,便于维护

      4. 多个异步等待合并便于解决

promise的缺点 

      1. 无法取消promise,一旦新建它就会立即执行,无法中途取消。

      2. 如果不设置回调函数,promise内部抛出的错误,不会反应到外部。

      3.当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

promise的一些方法

静态方法

      1. promise.resolve()

      2. promise.reject()

      3. promise.all()

      4. promise.rece()

实例方法
      1. promise.then(resolved,rejected)

      2. .catch(rejected) 

      3. finally()

.then()

  • 接收两个函数作为参数,分别代表fulfilled(成功)和rejected(失败)
  • .then()返回一个新的Promise实例,所以它可以链式调用
  • 当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
  • 状态响应函数可以返回新的promise,或其他值,不返回值我们可以认为它返回了一个null
  • 如果返回新的promise,那么下一级.then()会在新的promise状态改变之后执行
  • 如果返回其他任何值,则会立即执行下一级.then()
  •   .then()里面有.then()的情况

        因为.then()返回的还是Promise实例,会等里面的then()执行完,再执行外面的

错误处理两种做法:
第一种:reject('错误信息').then(() => {}, () => {错误处理逻辑})
第二种:throw new Error('错误信息').catch( () => {错误处理逻辑})
推荐使用第二种方式,更加清晰好读,并且可以捕获前面所有的错误(可以捕获N个then回调错误)

Promise.all()  批量执行

  • Promise.all([p1, p2, p3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
  • 它接收一个数组作为参数
  • 数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
  • 当所有的子Promise都完成,该Promise完成,返回值是全部值的数组
  • 有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果
  • Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。
Promise.race()类似于Promise.all(),区别在于它有任意一个完成就算完成
  • Promse.race就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态