1、Promise.all()
Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
Promise.all([p1, p2, p3]).then(([res1, res2, res3]) => {}).catch(e => console.log(e))
// p1、p2、p3都是 Promise 实例
p的状态由p1、p2、p3共同决定,分两种情况
- 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
- 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数
如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法。如果作为参数的 Promise 实例没有自己的catch方法,就会调用Promise.all()的catch方法
2、Promise.race()
Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例
const p = Promise.race([p1, p2, p3])
上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。
3、Promise.allSettled()
Promise.allSettled()方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。只有等到所有这些参数实例都返回结果,不管是fulfilled还是rejected,包装实例才会结束,该方法由 ES2020 引入
const p = Promise.race([p1, p2, p3])
上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。
const resolved = Promise.resolve(42)
const rejected = Promise.reject(-1)
const allSettledPromise = Promise.allSettled([resolved, rejected])
allSettledPromise.then(function (results) {
console.log(results)
})
// [{ status: 'fulfilled', value: 42 }, { status: 'rejected', reason: -1 }]
上面代码中,Promise.allSettled()的返回值allSettledPromise,状态只可能变成fulfilled。它的监听函数接收到的参数是数组results。该数组的每个成员都是一个Promise 实例对象。每个对象都有status属性,该属性的值只可能是字符串fulfilled或字符串rejected。fulfilled时,对象有value属性,rejected时有reason属性,对应两种状态的返回值。
4、Promise.resolve()
Promise.resolve()方法可以将现有对象转换为Promise对象,并返回。resolve方法的参数可分为以下四种情况
- 参数是一个 Promise 实例
如果参数是 Promise 实例,那么Promise.resolve将不做任何修改、原封不动地返回这个实例。
- 参数是一个具有then方法的对象
Promise.resolve方法会将这个对象转为 Promise 对象,然后就立即执行对象的then方法。
- 参数不是具有then方法的对象,或根本就不是对象
如果参数是一个原始值,或者是一个不具有then方法的对象,则Promise.resolve方法返回一个新的 Promise 对象,状态为resolved。
- 不带有任何参数
如果resolve不带参数,则直接返回一个resolved状态的 Promise 对象。
let thenable = {
then: (resolve, reject) => {
resolve(42)
}
}
let p1 = Promise.resolve(thenable)
p1.then(value => {
console.log(value)
})
网友评论