Promise
三个状态:
- pending:进行中
- fulfilled:已成功
- rejected:已失败
一旦状态改变,就不会再变
缺点:
- 无法中途取消Promise
- 如果不设置回调函数,Promise内部抛出的错误,无法反应到外部
- 在pending状态无法得知进展
const Promise = new Promise(funcition(resolve, reject){
if(/*异步操作成功*/){
resovle(value)
}else{
reject(value)
}
})
Promise.prototype.then()
第一个参数是resolved的回调函数,第二个是rejected的回调函数,都是可选的。
Promise.prototype.catch()
rejected时的回调函数。then()中抛出的错误也会被catch()捕获
Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch
语句捕获。
Promise.prototype.finally()
不管Promise状态如何,都会执行
不接受任何参数
Promise.all( [p1, p2, p3] )
两种情况:
- 只有
p1
、p2
、p3
的状态都变成fulfilled
,p
的状态才会变成fulfilled
,此时p1
、p2
、p3
的返回值组成一个数组,传递给p
的回调函数。 - 只要
p1
、p2
、p3
之中有一个被rejected
,p
的状态就变成rejected
,此时第一个被reject
的实例的返回值,会传递给p
的回调函数。
如果作为参数的Promise实例有自己的catch方法,一旦rejected,会调用自己的catch方法并成为resolved状态,并不会触发Promise.all()的catch方法
Promise.race( [p1, p2, p3] )
p1, p2, p3谁的状态最先改变,就取谁的值
Promise.allSettled( [p1, p2, p3] )
P1, p2, p3状态都改变后(无论成功失败),状态总是fulfilled,不会变成rejected。状态变成fulfilled后,Promise 的监听函数接收到的参数是一个数组,每个成员对应一个传入Promise.allSettled()的 Promise 实例
Promise.any( [p1, p2, p3] )
P1, p2, p3有一个fulfilled就会fulfilled,全部rejected才会rejected
Promise.resolve()
将先用对象转化为Promise对象
四种情况:
-
如果参数是 Promise 实例,那么
Promise.resolve
将不做任何修改、原封不动地返回这个实例。 -
参数是thenable对象
thenable指的是具有then方法的对象:
let thenable = { then: function(resolve, reject) { resolve(42); } };
Promise.resolve()
方法会将这个对象转为 Promise 对象,然后就立即执行thenable
对象的then()
方法。let thenable = { then: function(resolve, reject) { resolve(42); } }; let p1 = Promise.resolve(thenable); p1.then(function (value) { console.log(value); // 42 });
上面代码中,
thenable
对象的then()
方法执行后,对象p1
的状态就变为resolved
,从而立即执行最后那个then()
方法指定的回调函数,输出42。 -
参数不是具有
then()
方法的对象,或根本就不是对象如果参数是一个原始值,或者是一个不具有
then()
方法的对象,则Promise.resolve()
方法返回一个新的 Promise 对象,状态为resolved
。const p = Promise.resolve('Hello'); p.then(function (s) { console.log(s) }); // Hello
上面代码生成一个新的 Promise 对象的实例
p
。由于字符串Hello
不属于异步操作(判断方法是字符串对象不具有 then 方法),返回 Promise 实例的状态从一生成就是resolved
,所以回调函数会立即执行。Promise.resolve()
方法的参数,会同时传给回调函数。 -
不带任何参数
直接返回一个
resolved
状态的 Promise 对象。如果希望得到一个 Promise 对象,比较方便的方法就是直接调用
Promise.resolve()
方法。const p = Promise.resolve(); p.then(function () { // ... });