经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Omi » 查看文章
使用 Promise.withResolvers() 来简化你将函数 Promise 化的实现~~
来源:cnblogs  作者:azoux  时间:2024/6/13 10:31:31  对本文有异议

引言

在JavaScript编程中,Promise 是一种处理异步操作的常用机制。Promise 对象代表了一个尚未完成但预期将来会完成的操作的结果。在本文中,我们将探讨如何通过使用 ES2024 的 Promise.withResolvers API 来优化我们的 Promise 实现。

现有实现的问题

首先,让我们看一个简单的示例,展示在没有使用 Promise.withResolvers 时,如何实现一个函数,该函数在传入的另一个函数执行完毕后2秒才返回结果:

  1. const returnAfterTwoSeconds = (func, ...args) => {
  2. return new Promise((resolve, reject) => {
  3. setTimeout(() => {
  4. try {
  5. resolve(func(...args));
  6. } catch (e) {
  7. reject(e);
  8. }
  9. }, 2000);
  10. });
  11. };

虽然上述代码能够正常工作,但它的嵌套层次较深,对于初次阅读的人来说可能不够直观。

改进实现

为了提高代码的可读性,我们可以对上述实现进行一些改进:

  1. const returnAfterTwoSeconds = (func, ...args) => {
  2. let outerResolve = null;
  3. let outerReject = null;
  4. const promise = new Promise((resolve, reject) => {
  5. outerResolve = resolve;
  6. outerReject = reject;
  7. });
  8. setTimeout(() => {
  9. try {
  10. outerResolve(func(...args));
  11. } catch (e) {
  12. outerReject(e);
  13. }
  14. }, 2000);
  15. return promise;
  16. };

在这个改进版本中,我们首先创建了一个 Promise 对象,并暂存了它的 resolvereject 方法。然后在 setTimeout 中调用这些方法,最后返回 Promise 对象。这样,即使 setTimeout 中的回调执行完毕,返回的 Promise 对象也会根据回调的结果变为 resolved 或 rejected。

使用 Promise.withResolvers

现在,让我们看看如何使用 Promise.withResolvers 来进一步简化我们的代码:

  1. const returnAfterTwoSeconds = (func, ...args) => {
  2. const { promise, resolve, reject } = Promise.withResolvers();
  3. setTimeout(() => {
  4. try {
  5. resolve(func(...args));
  6. } catch (e) {
  7. reject(e);
  8. }
  9. }, 2000);
  10. return promise;
  11. };

可以看到,这个方法并没有为我们的代码带来性能或者说实现方式上的优化,但是它使用起来很简单,也很好理解~ 有助于提高代码的可读性和简洁~

Promise.withResolvers 详解

根据 MDN 文档Promise.withResolvers 的语法如下:

  • 语法:Promise.withResolvers()
  • 参数:无
  • 返回值:
    • promise: 一个 对象。
    • resolve: 一个函数,用于解决该 Promise。关于其语义,请参阅 构造函数。
    • reject: 一个函数,用于拒绝该 Promise。关于其语义,请参阅 构造函数。

自定义实现

最后,我们可以自定义一个函数来模拟 Promise.withResolvers 的行为:

  1. function myWithResolvers() {
  2. let resolve = null;
  3. let reject = null;
  4. const promise = new Promise((_resolve, _reject) => {
  5. resolve = _resolve;
  6. reject = _reject;
  7. });
  8. return { promise, resolve, reject };
  9. }

可以看到,这个api在实现上其实也很简单,只是把我们平常获取promise中resolve和reject的步骤封装到一个方法中,但为我们节省了很多时间~

原文链接:https://www.cnblogs.com/azoux/p/18245377

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号