Promise 基础,包括状态、基础 API、静态方法、链式调用和 async/await。
2022-09-15 03:35:27
Promise 的作用
Promise 是一套专门处理异步场景的规范,能有效避免回调地狱的产生,使异步代码更加清晰、简洁、统一。
Promise 并没有消除回调,而是消除了回调地狱。它能使用链式编程,让异步调用有序进行。
有了 Promise,异步任务就有了统一处理的方式。有了统一的方式之后,就可以进行进一步的优化。
Promise/A+ 规范
Promise/A+ 主要规定了 Promise 对象、状态流转和后续处理方式。
所有异步场景,都可以看作是一个异步任务。每个异步任务在 JavaScript 中应该表现为一个对象,这个对象被称为 Promise 对象。
Promise 的状态
每个 Promise 对象都有三种状态:
pending:挂起fulfilled:完成rejected:失败
任务总是从挂起状态变更到完成/失败状态,无法逆行。
挂起 -> 完成 的过程称为 resolve; 任务完成时,可能会有一个相关数据;
挂起 -> 失败 的过程称为 reject。 任务失败时,可能会有一个失败原因。
可以对任务进行后续处理,针对完成的后续处理称为 onFulfilled。针对失败的后续处理称为 onRejected。
基础 API
创建 Promise
可以通过 new Promise() 创建一个异步任务。
const p = new Promise((resolve, reject) => {
resolve('成功')
// reject('失败')
})
then
then() 用于注册 Promise 完成或失败后的处理函数。
p.then(
(data) => {
console.log(data)
},
(reason) => {
console.log(reason)
}
)
catch
catch() 用于处理失败状态。
p.catch((reason) => {
console.log(reason)
})
finally
finally() 无论任务完成还是失败都会执行。
p.finally(() => {
console.log('任务结束')
})
静态方法
Promise.resolve():返回一个完成状态的PromisePromise.reject():返回一个拒绝状态的PromisePromise.all():全部成功才成功,有一个失败就失败Promise.any():有一个成功就成功,全部失败才失败Promise.race():谁先完成就以谁的结果为准Promise.allSettled():等待所有任务都有结果,不关心成功或失败
链式调用
then() 方法会返回一个新的 Promise,因此可以继续调用 then()。
Promise.resolve(1)
.then(data => data + 1)
.then((data) => {
console.log(data)
})
async / await
async
async 关键字用于修饰函数,被它修饰的函数一定会返回一个 Promise。
async function fn() {
return 1
}
fn() // Promise { 1 }
await
await 表示等待某个 Promise 完成,必须用于 async 函数中。
async function fn() {
const data = await Promise.resolve(1)
console.log(data)
}