乾坤框架中reduce的巧妙使用

JavaScript中,reduce是一个数组方法,用于将数组中的元素按照指定的方式进行累积计算。它接受一个回调函数作为参数,并且可以接受一个初始值作为可选参数。 回调函数接受四个参数:累积值(也称为累加器)、当前值、当前索引和原始数组。回调函数应该返回一个新的累积值,该值将在下一次迭代中作为累积值传递。

csharp 复制代码
const numbers = [1, 2, 3, 4, 5];

const sum = numbers.reduce((accumulator, currentValue) => {
  return accumulator + currentValue;
}, 0);

console.log(sum); // 输出 15

在乾坤框架中有一个很有意思的reduce的使用

csharp 复制代码
function execHooksChain<T extends ObjectType>(
  hooks: Array<LifeCycleFn<T>>,
  app: LoadableApp<T>,
  global = window,
): Promise<any> {
  if (hooks.length) {
    return hooks.reduce((chain, hook) => chain.then(() => hook(app, global)), Promise.resolve());
  }

  return Promise.resolve();
}

这段代码使用了reduce 方法来依次执行一个包含多个异步操作的数组hooks 。每个异步操作都是一个函数,接受两个参数appglobal,并返回一个Promise。

  1. hooks是一个包含多个异步操作的数组。
  2. reduce 方法被调用在hooks 数组上,初始值为Promise.resolve() ,这是一个已经解决(resolved)的Promise
  3. 在每次迭代中,reduce 方法将累积值chain 和当前值hook作为参数传递给回调函数。
  4. 回调函数中,chain 是一个Promise,表示前面所有异步操作的链式调用。hook是当前的异步操作函数。
  5. 回调函数中,**chain.then(() => hook(app, global))**将当前异步操作函数添加到前面所有异步操作的链式调用中。这样可以确保前一个异步操作完成后再执行下一个异步操作。
  6. reduce方法返回的是一个Promise,表示所有异步操作的链式调用。
  7. 最后,这个Promise可以被进一步处理,例如使用**.then()**方法添加回调函数来处理所有异步操作完成后的结果。

这段代码的目的是按照数组中的顺序依次执行异步操作,并确保每个异步操作在前一个操作完成后再执行。这种方式可以用于处理需要按顺序执行的异步任务,例如在应用程序初始化过程中加载插件或模块。

html 复制代码
function a() {
        return Promise.resolve();
      }

      function b() {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            console.log("b");
            resolve(2);
          }, 2000);
        });
      }

      function c() {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            console.log("c");
            resolve(2);
          }, 2000);
        });
      }

      async function execHooks(funArr) {
        for (let i = 0; i < funArr.length; i++) {
          await funArr[i]();
        }
      }

      function awaitExecHooks(funArr) {
        return funArr.reduce(
          (prev, hook) => prev.then(() => hook()),
          Promise.resolve()
        );
      }
      execHooks([a, b, c]).then(() => {
        console.log("finish");
      });

      var d = awaitExecHooks([a, b, c]);
      d.then(() => {
        console.log("await finish");
      });

同样,使用for循环和await可以实现reduce的效果。reduce是一个很有意思的函数,可以实现一些数组去重,扁平化,数组数据的各种处理。让人想起了RXJS中的scan操作符!

相关推荐
爱吃的强哥8 分钟前
vue3 使用 vite 管理多个项目,实现各子项目独立运行,独立打包
前端·javascript·vue.js
涵信16 分钟前
第十节:性能优化高频题-虚拟DOM与Diff算法优化
javascript·vue.js·性能优化
谈不譚网安17 分钟前
CSRF请求伪造
前端·网络安全·csrf
TT模板22 分钟前
苹果cmsV10主题 MXonePro二开优化修复开源版
前端·html5
拖孩23 分钟前
【Nova UI】十一、组件库中 Icon 组件的测试、使用与全局注册全攻略
前端·javascript·vue.js·ui·sass
去伪存真29 分钟前
不用动脑,手把手跟着我做,就能掌握Gitlab+Jenkins提交代码自动构部署
前端·jenkins
天天扭码1 小时前
深入解析 JavaScript 中的每一类函数:从语法到对比,全面掌握适用场景
前端·javascript·面试
小希爸爸1 小时前
4、中医基础入门和养生
前端·后端
kooboo china.1 小时前
Tailwind CSS 实战:基于 Kooboo 构建企业官网页面(一)
前端·css·编辑器
uhakadotcom2 小时前
Fluid:云原生数据加速与管理的简单入门与实战
前端