Promise特点及其方法

2,199 阅读2分钟

一句话概括一下 Promise:

Promise 用于异步操作,表示一个还未完成但是预期会完成的操作。

语法特点:

  1. new Promse 的时候,作为参数的函数是立刻执行的,并且 resolve()/reject() 不会阻止代码的执行(报错就会中断),就算是在 resolve() 中执行一个函数也会执行
new Promise((resolve, reject)=>{
  console.log(1)
  resolve((()=>{console.log(2)})())
  console.log(3)
})
// 1
// 2
// 3
  1. Promise 的状态一旦确定之后就不会改变,也就是说,在 resolve 之后再使用 reject 是没用的,反之亦然;

  2. 就算 promise 已经确定了 resolved / rejected 状态,后面(过了一会)再写上 .then / .catch 依然是会调用回调函数的。

  3. .Primise 会“吃掉报错”,它的报错无法被外部不错,会触发 rejected 状态,并且执行 .then 或 .catch 中的 reject 回调

//我们在 promise 中,写:
throw new Error()

//等价于
try {
  throw new Error()
} catch(e){
  reject(e)
}
  1. 有一个 promise (简称 p1),它 resolve 了另一个 promise (简称 p2),p1 会得到 p2 的状态 5.1 如果 p2 有 .then / .catch 会先走 then / catch 的回调函数再把状态传给 p1 5.2 因为 p1 是获得 p2 的状态,所以如果 p2 的最终状态是 rejected, 那么 p1 中就算使用 resolve 依然是得到 rejected 状态 5.3 不过 如果在 p1 中是 reject(p2), 那么不管 p2 是 resolved 还是 rejected ,p1 的状态都是 rejected

  2. .catch() 不一定要直接连着报错的 promise, 因为 promise 的错误会 “冒泡” 往后传

方法

  1. .finally() 无论如何都执行,用于处理与状态无关的操作

  2. .all() 接受多个 promise 组成的数组作为参数。
    2.1 只要一个 rejected, .all() 直接返回 .rejected,状态为第一个 rejected 的 promise 的状态
    2.2 只有在所有 promise 都 resolve 的情况下,.all() resolved, 把每个 promises 组成的数组作为参数传给 .then() 回调

    注意,如果一个 promise 报错但是自身有 .catch() 捕获,它传给 .all() 的结果是 resolved(不考虑在 .catch() 中报错)

  3. .race() 接受多个 promise 组成的数组作为参数,.race() 的状态由第一个确定状态的 promise 决定

    注,.all() , .race() 的参数数组中,如果一个 item 不是 promise,会自动调用 .resolve() 方法

  4. .resolve() 用于得到一个 resolve 状态的 promise,它的参数一般分四种:
    4.1 普通值, resolve 这个值
    4.2 参数本来就是一个 promise, 不做任何修改,直接返回;
    4.3 thenable对象(具有then方法的对象),返回的的 promise 会采用 then 方法的最终状态
    4.4 什么都没有,立即 resolve 的promise,resolve 一个 undefined,在本轮 eventLoop 结束时执行

  5. .reject() 与 .resolve() 不同,.reject() 的值不管是什么,都会直接 reject

听说 promise 有这么几个缺点

  1. 一旦执行无法中途停止;
  2. 外部无法捕捉错误;
  3. 无法得知目前进展到哪一个阶段
  4. Promise 真正执行回调的时候,定义 Promise 那部分实际上已经走完了,所以 Promise 的报错堆栈上下文不太友好。