一句话概括一下 Promise:
Promise 用于异步操作,表示一个还未完成但是预期会完成的操作。
语法特点:
- new Promse 的时候,作为参数的函数是立刻执行的,并且 resolve()/reject() 不会阻止代码的执行(报错就会中断),就算是在 resolve() 中执行一个函数也会执行
new Promise((resolve, reject)=>{
console.log(1)
resolve((()=>{console.log(2)})())
console.log(3)
})
// 1
// 2
// 3
-
Promise 的状态一旦确定之后就不会改变,也就是说,在 resolve 之后再使用 reject 是没用的,反之亦然;
-
就算 promise 已经确定了 resolved / rejected 状态,后面(过了一会)再写上 .then / .catch 依然是会调用回调函数的。
-
.Primise 会“吃掉报错”,它的报错无法被外部不错,会触发 rejected 状态,并且执行 .then 或 .catch 中的 reject 回调
//我们在 promise 中,写:
throw new Error()
//等价于
try {
throw new Error()
} catch(e){
reject(e)
}
-
有一个 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
-
.catch() 不一定要直接连着报错的 promise, 因为 promise 的错误会 “冒泡” 往后传
方法
-
.finally() 无论如何都执行,用于处理与状态无关的操作
-
.all() 接受多个 promise 组成的数组作为参数。
2.1 只要一个 rejected, .all() 直接返回 .rejected,状态为第一个 rejected 的 promise 的状态
2.2 只有在所有 promise 都 resolve 的情况下,.all() resolved, 把每个 promises 组成的数组作为参数传给 .then() 回调注意,如果一个 promise 报错但是自身有 .catch() 捕获,它传给 .all() 的结果是 resolved(不考虑在 .catch() 中报错)
-
.race() 接受多个 promise 组成的数组作为参数,.race() 的状态由第一个确定状态的 promise 决定
注,.all() , .race() 的参数数组中,如果一个 item 不是 promise,会自动调用 .resolve() 方法
-
.resolve() 用于得到一个 resolve 状态的 promise,它的参数一般分四种:
4.1 普通值, resolve 这个值
4.2 参数本来就是一个 promise, 不做任何修改,直接返回;
4.3 thenable对象(具有then方法的对象),返回的的 promise 会采用 then 方法的最终状态
4.4 什么都没有,立即 resolve 的promise,resolve 一个 undefined,在本轮 eventLoop 结束时执行 -
.reject() 与 .resolve() 不同,.reject() 的值不管是什么,都会直接 reject
听说 promise 有这么几个缺点
- 一旦执行无法中途停止;
- 外部无法捕捉错误;
- 无法得知目前进展到哪一个阶段
- Promise 真正执行回调的时候,定义 Promise 那部分实际上已经走完了,所以 Promise 的报错堆栈上下文不太友好。