什么是 Promise?
Promise 是一种处理异步操作的机制。在 JavaScript 中,异步操作常常是通过回调函数来实现的。回调函数是 JavaScript 中常见的一种异步操作方式,但是回调函数代码嵌套层数深,代码可读性差且难以维护。而 Promise 的出现使得异步操作的处理变得简单易懂。
Promise 是一种对象,它表示一个异步操作最终会返回一个结果。Promise 有三种状态:等待态、已完成态(fulfilled)和已拒绝态(rejected),一个 Promise 只能从等待态转换为其中的一种完成状态:
- 等待态,表示 Promise 正在执行中,并未成功或失败;
- 已完成态(fulfilled),表示 Promise 执行成功,并返回了一个值;
- 已拒绝态(rejected),表示 Promise 执行失败(或出现错误),并返回拒绝的原因。
Promise 的实现原理
Promise 的实现原理是基于回调函数,利用事件循环机制。Promise 的实现主要依靠构造函数和原型方法来实现。
Promise 的构造函数接受一个函数参数,该函数参数被称为执行器函数,执行器函数接受两个函数参数 resolve 和 reject,这两个函数是 Promise 构造函数内置的,用于将 Promise 从等待态转换为已完成态或已拒绝态。
const promise = new Promise((resolve, reject) => { // 异步代码 if (异步操作成功) { resolve(成功的结果); } else { reject(失败的原因); } });
执行器函数中执行的异步操作代码通过 resolve 函数让 Promise 状态从等待态转换为已完成态,并返回异步操作结果;如果异步操作发生了错误,则通过 reject 函数让 Promise 状态从等待态转换为已拒绝态,并返回错误原因。
Promise 实例对象有一个 then 方法用于注册 Promise 状态转换后的回调函数。
promise.then(onFulfilled, onRejected);
如果 Promise 状态为已完成态,则直接执行 onFulfilled 函数;如果 Promise 状态为已拒绝态,则直接执行 onRejected 函数。
除了 then 方法,Promise 还有 catch、finally 等方法。
- then 的一个参数是成功状态的回调,还有一个参数是失败时的回调,但是其实我们用 catch 来捕获失败原因更为简单。
promise.then((result) => { // 代码 }).catch((error) => { // 错误 });
- finally 方法不接收任何的 resolve 或 reject 状态的参数函数,它在 promise 执行完毕后执行指定的回调函数。
promise.finally(() => { // 不接受参数的回调函数 });
Promise 的使用方法
下面我们通过代码来说明 Promise 的使用方法。
-- -------------------- ---- ------- -------- --------- - ------ --- ----------------- ------- -- - ----- --- - --- ----------------- --------------- ----- ---------------------- - -------- -- - -- --------------- --- -- - -- ----------- --- ---- - -------------------------- - ---- - ---------- --------------- - - - ----------- --- - ---------------------------- -- - ---------------------- ---------------- -- - ------------------- --
上面的代码中使用 AJAX 请求获取数据,通过 Promise 实例对象的 then 方法和 catch 方法,分别注册请求成功和请求失败后的回调函数。
总结
Promise 的出现使得异步操作的处理变得简单易懂,而不再依赖于回调函数的嵌套。Promise 基于构造函数和原型方法实现,利用事件循环机制处理异步操作,将异步操作的结果封装成 Promise 实例对象,并实现 Promise 状态的状态转换和状态变化处理,从而使 Promise 实例对象的 then 和 catch 等方法得以被调用并处理相应结果。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6486757048841e9894503a4e