开篇

在上一篇文章中,给 nue-cli 添加了拉取版本号的功能,这一次来优化一下代码,使用函数柯里化的方式来优化代码。

实现

函数柯里化

函数柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

在进行改写之前,首先给大家简单介绍一下函数柯里化,写一个简单的例子来演示一下。

function demo(a, b) {
return a + b;
} const res = demo(1, 2);
console.log(res);

这是一个简单的函数,接收两个参数,然后返回两个参数的和,除了这种写法其实还可以改写成这样:

function demo(a) {
return function (b) {
return a + b;
};
}

这个时候呢,该如何调用呢?首先是调用 demo 方法,传入一个参数,然后返回一个函数,再调用这个函数,传入另一个参数,最后得到结果。

const res = demo(1)(2);
console.log(res);

了解了这种写法之后,就可以使用函数柯里化来优化代码了。

优化控制台加载效果

为什么是要优化控制台加载效果呢?因为我发现后续可能对控制台加载效果的需求会比较多,所以就把这个功能单独提取出来。

例如像之前拉取模板名称,拉取版本号,拉取模板等等,都需要控制台加载效果,所以就把这个功能单独提取出来,以后需要的时候直接调用就可以了。

const waitLoading = async ( message, fn) => {
const spinner = ora(message).start();
const result = await fn();
spinner.succeed(`${message} successfully`);
return result;
}

这个函数接收两个参数,第一个参数是 message,第二个参数是 fnmessage 是控制台加载效果的提示信息,fn 是一个异步函数,这个函数会返回一个 Promise 对象,然后在函数内部调用 ora,显示加载效果,然后调用 fn,等待 fn 执行完毕,最后关闭加载效果。

改造获取模板名称

主要就是将 fetchRepoList 中通过 ora 显示加载效果的代码删除掉,然后调用 waitLoading 函数,将 fetchRepoList 传入进去,这样就改造完成了。

const fetchRepoListData = await waitLoading('downloading template names...', fetchRepoList)();

改造获取版本号

这里改造其实是一样的,不过这里有一个小问题,就是 getTemplateTags 这个函数是需要传入一个参数的,所以需要对 waitLoading 进行改造。

const waitLoading =  ( message, fn) => async (...args) => {
const spinner = ora(message).start();
const result = await fn(...args);
spinner.succeed(`${message} successfully`);
return result;
}

这回的 waitLoading 方法与之前的不同地方就是在添加了一个 ...args 参数,这个参数是用来接收 fn 函数的参数的,然后在调用 fn 的时候将参数传入进去。

接下来就是改造调用 getTemplateTags 的地方了。

const fetchTemplateTags = await waitLoading('downloading template tags...', getTemplateTags)(template);

由于改造了 waitLoading 方法,之前调用 waitLoading 方法的地方也需要进行改造,就是多加一个调用过程。

好,大致就是这样,本篇文章就到这里了,下一篇文章继续完善 nue-cli。

『手撕Vue-CLI』函数柯里化优化代码的更多相关文章

  1. 手写系列:call、apply、bind、函数柯里化

    少废话,show my code call 原理都在注释里了 // 不覆盖原生call方法,起个别名叫myCall,接收this上下文context和参数params Function.prototy ...

  2. 前端面试手写代码——JS函数柯里化

    目录 1 什么是函数柯里化 2 柯里化的作用和特点 2.1 参数复用 2.2 提前返回 2.3 延迟执行 3 封装通用柯里化工具函数 4 总结和补充 1 什么是函数柯里化 在计算机科学中,柯里化(Cu ...

  3. 【React】学习笔记(一)——React入门、面向组件编程、函数柯里化

    课程原视频:https://www.bilibili.com/video/BV1wy4y1D7JT?p=2&spm_id_from=pageDriver 目录 一.React 概述 1.1.R ...

  4. 【转载】JS中bind方法与函数柯里化

    原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...

  5. [转]js函数式变成之函数柯里化

    本文转自:https://segmentfault.com/a/1190000003733107 函数柯里化是指参数逐渐求值的过程. 我觉得它是:降低通用性,提高专用性. 通常,柯里化是这样的过程,“ ...

  6. 函数柯里化(Currying)示例

    ”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数.可以看成一个强大的函数工厂,结合函数式编程,可以叠加出很BT的能力.下面给出了两个示例,说明 ...

  7. Javascript函数柯里化(curry)

    函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...

  8. JavaScript函数柯里化的一些思考

    1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函 ...

  9. 一道javascript面试题(闭包与函数柯里化)

    要求写一个函数add(),分别实现能如下效果: (1)console.log(add(1)(2)(3)(4)()); (2)console.log(add(1,2)(3,4)()); (3)conso ...

  10. 深入理解javascript函数进阶系列第二篇——函数柯里化

    前面的话 函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名.本文将详细 ...

随机推荐

  1. 如何增强Java Excel API 的导入和导出性能

    前言 GrapeCity Documents for Excel (以下简称GcExcel)是葡萄城公司的一款服务端表格组件,它提供了一组全面的 API 以编程方式生成 Excel (XLSX) 电子 ...

  2. NodeJs进阶开发、性能优化指南

    相信对于前端同学而言,我们去开发一个自己的简单后端程序可以借助很多的nodeJs的框架去进行快速搭建,但是从前端面向后端之后,我们会在很多方面会稍显的有些陌生,比如性能分析,性能测试,内存管理,内存查 ...

  3. 如何实现一个 Paxos

    简介: Paxos 作为一个经典的分布式一致性算法(Consensus Algorithm),在各种教材中也被当做范例来讲解.但由于其抽象性,很少有人基于朴素 Paxos 开发一致性库,本文介绍的实现 ...

  4. 从原理到操作,让你在 Apache APISIX 中代理 Dubbo3 服务更便捷

    简介: 本文为大家介绍了如何借助 Apache APISIX 实现 Dubbo Service 的代理,通过引入 dubbo-proxy 插件便可为 Dubbo 框架的后端系统构建更简单更高效的流量链 ...

  5. OpenTelemetry 简析

    简介: OpenTelemetry 是 CNCF 的一个可观测性项目,旨在提供可观测性领域的标准化方案,解决观测数据的数据模型.采集.处理.导出等的标准化问题,提供与三方 vendor 无关的服务. ...

  6. 解密 Dubbo 三大中心的部署架构

    ​简介:Dubbo作为一个微服务框架,Dubbo SDK与应用服务绑定在同一个进程内,它跟随着应用服务被部署在分布式集群各个位置,为了在分布式环境下实现各个应用服务间的协作, Dubbo 定义了一些中 ...

  7. [GPT] Unable to negotiate with xx.xx.xx.xx port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

      这个错误通常发生在 SSH 客户端无法找到与 SSH服务器 匹配的主机密钥类型时. 这可能是因为SSH服务器配置为使用SSH客户端不支持的主机密钥类型. 要解决此问题,您需要将缺少的主机密钥类型添 ...

  8. [FAQ] swagger-php 支持 Authorization Bearer token 校验的用法

    @OA\SecurityScheme 可以是 Controller 层面也可以是 Action 层面. 类型 type="apiKey". in="header" ...

  9. [PHP] 浅谈 Laravel 三大验证方式的区别, auth:api, passport, auth:airlock

    auth:api 最先出来,提供了最简单和最实用的方式进行 api 身份校验. 关于它的含义和用法你可以参考以下两篇: 浅谈 Laravel Authentication 的 auth:api 浅谈 ...

  10. dotnet 在国产 UOS 系统利用 dotnet tool 工具做文件传输

    我在一台设备上安装了 UOS 系统,但是我如何在我的主开发设备上和 UOS 系统传输文件?通过 dotnet tool 工具可以完成大部分的工作,当然,使用 dotnet tool 不仅做文件传输,还 ...