Promise 原理探究
Promise 是 JavaScript 中用于处理异步操作的一种对象,它的状态不受外界影响,Promise 有三种状态:pending(等待态)、fulfilled(成功态)和rejected(失败态),一旦 Promise 对象的状态改变,就不会再变,无论状态变为成功还是失败。
Promise 构造函数
Promise 是一个构造函数,接收一个 executor 函数作为参数,这个 executor 函数接收两个参数:resolve 和 reject,它们是两个函数,由 JavaScript 引擎提供。
new Promise((resolve, reject) => { // ... some code if (/* 异步操作成功 */) { resolve(value); // 当异步操作成功时,使用resolve函数返回结果 } else { reject(error); // 当异步操作失败时,使用reject函数抛出错误 } });
Promise 实例方法
Promise 原型对象上定义了以下方法:
then
:注册回调函数,用于处理 Promise 的结果,它接受两个参数:onFulfilled 和 onRejected,当 Promise 状态变为 fulfilled 时,会调用 onFulfilled 函数;当状态变为 rejected 时,会调用 onRejected 函数。
catch
:注册回调函数,用于处理 Promise 的异常,它接受一个参数:onRejected,当 Promise 状态变为 rejected 时,会调用 onRejected 函数。
finally
:注册回调函数,无论 Promise 状态如何改变,都会执行,它接受一个参数:onFinally。
all
:接收一个 Promise 实例的数组,当这个数组里的所有 Promise 都变为 fulfilled 时,返回一个新的 Promise 对象。
race
:接收一个 Promise 实例的数组,当这个数组里的任何一个 Promise 发生改变时,返回那个 Promise 实例的状态。
allSettled
:接收一个 Promise 实例的数组,当这个数组里的所有 Promise 状态都确定时,返回一个新的 Promise 对象。
reject
:返回一个状态为 rejected 的 Promise 对象。
resolve
:返回一个状态为 fulfilled 的 Promise 对象。
Promise 链式调用
Promise 支持链式调用,可以在 then、catch、finally 方法后继续调用这些方法,这是因为这些方法返回的都是新的 Promise 对象。
promise.then(onFulfilled).then(onFulfilled).catch(onRejected).finally(onFinally);
Promise 静态方法
Promise 构造函数上有一些静态方法:
Promise.reject(value)
:返回一个状态为 rejected 的 Promise 对象。
Promise.resolve(value)
:如果传入的 value 是一个 Promise 对象,则直接返回该对象;否则返回一个状态为 fulfilled 的 Promise 对象,其结果值为 value。
Promise.all(iterable)
:接收一个 iterable 类型的参数,返回一个新的 Promise 对象,当 iterable 中的所有 Promise 对象都变为 fulfilled 时,返回一个包含所有 Promise 结果的数组。
Promise.race(iterable)
:接收一个 iterable 类型的参数,返回一个新的 Promise 对象,当 iterable 中的任何一个 Promise 对象状态改变时,返回那个 Promise 对象的状态。
Promise.allSettled(iterable)
:接收一个 iterable 类型的参数,返回一个新的 Promise 对象,当 iterable 中的所有 Promise 对象状态都确定时,返回一个包含所有 Promise 结果的数组。
Promise.prototype.finally(onFinally)
:无论 Promise 状态如何改变,都会执行 onFinally 函数。
Promise.prototype.catch(onRejected)
:注册回调函数,用于处理 Promise 的异常。
Promise.prototype.then(onFulfilled, onRejected)
:注册回调函数,用于处理 Promise 的结果。
Promise 错误处理
Promise 的错误具有“冒泡”性质,会一直向后传递,直到被 onRejected 捕获,如果没有注册 onRejected,则会直接抛出错误。
Promise 性能优化
1、尽量减少嵌套的 Promise,避免回调地狱。
2、使用 async/await 语法糖,使代码更易读、易维护。
3、合理使用 Promise.all、Promise.race、Promise.allSettled 等静态方法,提高代码效率。
4、避免在 then、catch、finally 中进行耗时操作,以免阻塞事件循环。
5、尽量避免在 then、catch、finally 中返回非 Promise 对象,以保持链式调用的连贯性。
下面是一个介绍,描述了Promise
对象返回结果的原理探究:
Promise 状态 | 描述 | 返回结果 |
pending (等待态) | 初始状态,既没有被兑现,也没有被拒绝。 | undefined 或尚未决定的值 |
fulfilled (兑现态) | 意味着操作成功完成。 | 返回传递给resolve 方法的值 |
rejected (拒绝态) | 意味着操作失败。 | 返回传递给reject 方法的理由(通常是错误或拒绝的原因) |
下面进一步展开说明Promise
的原理:
Promise 行为 | 详细描述 |
状态转换 | Promise 对象的状态只能从pending 转换为fulfilled 或rejected ,且这种转换只能发生一次。 |
状态不可逆 | 一旦Promise 对象的状态变为fulfilled 或rejected ,就不能再改变状态。 |
值传递 | resolve 函数用来将Promise 对象的状态从pending 变为fulfilled ,并将操作成功的结果值传递出去。 |
理由传递 | reject 函数用来将Promise 对象的状态从pending 变为rejected ,并将操作失败的理由传递出去。 |
回调函数处理 | Promise 对象的.then() 和.catch() 方法可以注册回调函数,分别处理fulfilled 和rejected 状态下的返回结果。 |
链式调用 | .then() 和.catch() 方法返回一个新的Promise ,允许进行链式调用。 |
异步执行 | Promise 的状态转换和回调函数的执行是异步的,即使状态改变立即发生,回调函数也会被放入事件队列等待执行。 |
这个介绍概括了Promise
的一些基本原理和它返回结果的含义,希望对你有所帮助。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/707992.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复