Promise
构造函数
js
new Promise((resolve, reject) => {
// ...
})状态
padding- 初始状态
- 可以转换为
fulfilled或rejected
fulfilled- 最终态,不可变
- 执行
resolve事件,状态变为fulfilled,执行onFulfilled函数
rejected- 最终态,不可变
- 执行
reject事件,状态变为rejected,执行onRejected函数
静态方法
Promise.resolve
Promise.resolve 方法可以认为是 new Promise() 方法的语法糖
js
Promise.resolve(42)
// 等同于
new Promise(function (resolve) {
resolve(42)
})Promise.reject
Promise.reject 方法可以认为是 new Promise() 方法的语法糖
js
Promise.reject(42)
// 等同于
new Promise(function (resolve, reject) {
reject(42)
})Promise.then
promise.then(onFulfilled, onRejected)
回调函数异步执行
onFulfilled和onRejected是微任务`onFulfilled和onRejected只能是函数,如果不是函数,会被忽略
js
Promise.resolve('foo')
.then(Promise.resolve('bar'))
.then(function (result) {
console.log(result)
}) // 'foo'- 返回值是一个新的
Promise对象
js
const p1 = new Promise((resolve, reject) => {
resolve('foo')
})
const p2 = p1.then((value) => {
console.log(value)
})
const p3 = p2.catch((error) => {
console.log(error)
})
console.log(p1 === p2) // false
console.log(p2 === p3) // falsePromise.catch
Promise.catch只是promise.then(undefined, onRejected)方法的语法糖
js
Promise.resolve()
.then((data) => console.log(data))
.catch((err) => console.log(err))
// 相当于
Promise.resolve()
.then((data) => console.log(data))
.then(undefined, (err) => console.log(err))catch函数在同一个时间点只属于某一个Promise
js
let p1 = new Promise((resolve, reject) => {
// 第一层具体执行逻辑
resolve(1) // Promise(1)
})
.then((res) => {
// 第二层具体执行逻辑
return 2 // Promise(2)
})
.then((res) => {
// 第三层具体执行逻辑
return 3 // Promise(3)
})
.catch((err) => {
console.log(err)
})如果第一层具体执行逻辑中出现错误,那么 p1 就会进入 catch 函数,而不会进入第二层具体执行逻辑,也不会进入第三层具体执 行逻辑
如果第二层具体执行逻辑中出现错误,那么 p1 就会进入 catch 函数,而不会进入第三层具体执行逻辑
如果第三层具体执行逻辑中出现错误,那么 p1 就会进入 catch 函数
Promise.all
Promise.all 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例
js
const p = Promise.all([p1, p2, p3])p 的状态由 p1、p2、p3 决定,分成两种情况
- 只有
p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个 数组,传递给p的回调函数 - 只要
p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传 递给p的回调函数
Promise.race
Promise.race只要有一个promise对象进入FulFilled或者Rejected状态的话,就会继续进行后面的处理- 和
Promise.all一样是所有数组当中的 Promise 是同时并行的 Promise.race在第一个promise对象变为Fulfilled之后,并不会取消其他promise对象的执行