首页 > 其他分享 >使用 Promise.withResolvers() 来简化你将函数 Promise 化的实现~~

使用 Promise.withResolvers() 来简化你将函数 Promise 化的实现~~

时间:2024-06-13 10:46:08浏览次数:14  
标签:resolve const 简化 promise reject Promise withResolvers

引言

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

现有实现的问题

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

const returnAfterTwoSeconds = (func, ...args) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        resolve(func(...args));
      } catch (e) {
        reject(e);
      }
    }, 2000);
  });
};

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

改进实现

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

const returnAfterTwoSeconds = (func, ...args) => {
  let outerResolve = null;
  let outerReject = null;
  const promise = new Promise((resolve, reject) => {
    outerResolve = resolve;
    outerReject = reject;
  });

  setTimeout(() => {
    try {
      outerResolve(func(...args));
    } catch (e) {
      outerReject(e);
    }
  }, 2000);

  return promise;
};

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

使用 Promise.withResolvers

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

const returnAfterTwoSeconds = (func, ...args) => {
  const { promise, resolve, reject } = Promise.withResolvers();

  setTimeout(() => {
    try {
      resolve(func(...args));
    } catch (e) {
      reject(e);
    }
  }, 2000);

  return promise;
};

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

Promise.withResolvers 详解

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

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

自定义实现

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

function myWithResolvers() {
  let resolve = null;
  let reject = null;
  const promise = new Promise((_resolve, _reject) => {
    resolve = _resolve;
    reject = _reject;
  });

  return { promise, resolve, reject };
}

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

标签:resolve,const,简化,promise,reject,Promise,withResolvers
From: https://www.cnblogs.com/azoux/p/18245377

相关文章

  • Vue2基础知识:v-model在组件传值中的使用,表单组件如何封装,如何用v-model简化父传子,子传
    要想要了解v-model在组件传值中如何使用首先得先了解表单组件如何封装数据在父组件那里,表单结构在子组件那里。1.表单组件如何封装1.父传子:数据应该是父组件props传递过来的,v-model拆解绑定数据。(为什么说是拆解呢?因为不可以直接v-model绑定,子组件只能改变自己的值,不能改变......
  • 封装一个Promise.all 的函数
    //1.准备三个异步函数constpromise1=Promise.resolve('prom11ise1');constpromise2=newPromise(function(resolve,reject){setTimeout(resolve,2000,'promise2');});constpromise3=newPromise(function(resolve......
  • BOSHIDA AC/DC电源模块:简化电路设计的便捷解决方案
    BOSHIDAAC/DC电源模块:简化电路设计的便捷解决方案AC/DC电源模块是一种常用的电力转换装置,用于将交流电源转换为直流电源,以提供给各种电子设备和系统使用。它在电路设计中起到了简化电路、提高效率和可靠性的重要作用。本文将介绍AC/DC电源模块的工作原理、应用领域以及优势。......
  • 【CPP】队列简介及其简化模拟实现
    队列简介及其简化模拟实现目录1.队列简介2.队列简化模拟实现1.队列简介队列是一种满足先进先出的数据结构。具体参考:【数据结构】队列在CPP中,stl也存在库队列,方便使用。库队列参考:queue_stl2.队列简化模拟实现template<classT,classcontainer=deque<T......
  • Promise对象
    Promise对象使用★Promise基本认识Promise是一个对象,用于表示异步操作的最终完成(或失败)及其结果值。它允许你关联处理程序,这些处理程序将在异步操作成功完成时或者失败时调用,从而避免了更复杂的嵌套回调(即回调地狱)。Promise对象通常用于执行异步操作,如网络请求、文件操作等......
  • tapPromise 函数 (绑定hooks方法)tapable 库,创建自定义插件的库
    tapPromise函数(绑定hooks方法)tapable库,创建自定义插件的库刚看到了一个插件的use函数//引入组件use(plugin:IPluginClass,options?:IPluginOption){if(this._checkPlugin(plugin)&&this.canvas){this._saveCustomAttr(plugin);constpluginRu......
  • 简化stream流等工具类(函数式编程的应用案例)
    操作集合publicclassCollectionUtils{publicstaticbooleancontainsAny(Objectsource,Object...targets){returnasList(targets).contains(source);}publicstaticbooleanisAnyEmpty(Collection<?>...collections){retu......
  • 【鸿蒙】---鸿蒙Next小课堂之Promise
    前言Promise是一种用于处理异步操作的对象,可以将异步操作转换为类似于同步操作的风格,以方便代码编写和维护。简而言之:Promise用来管理异步,方便编码。这时候该有人要问了,怎么区分异步和同步呢?同步代码:逐行执行,需原地等待结果后,才继续向下执行。异步代码:调用后耗时,不阻塞......
  • Promise对象
    在JavaScript中,Promise对象是一个表示异步操作最终完成(或失败)及其结果值的对象。Promise提供了一种更加优雅和强大的异步编程解决方案。Promise具有以下特点:状态:一个Promise对象有三种状态:Pending(等待状态):初始状态,既不是成功,也不是失败状态。Fulfilled(已成功):意味着操作成功......
  • UniTask入门指南:简化Unity中的异步编程
    UniTask入门指南:简化Unity中的异步编程介绍:UniTask是一个轻量级、高性能的异步编程库,专门针对Unity开发进行了优化。与Unity标准的Task系统相比,UniTask提供了更加简洁和高效的异步编程方式。在Unity项目中使用UniTask可以大大提高开发效率,简化异步操作的编码过程。UniTask......