链式调用的本质

1,903 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

用过jQuery的乡亲父老们肯定很熟悉下面的代码:

$(".testNode")
    .css('color','red')
    .show(200)
    .removeClass('class1');

常用数组的乡亲父老们肯定也很熟悉下面的代码:

[1,2,3,4]
    .filter(filterFn)
    .map(mapFn)
    .join("")

乡亲父老们,再看看Promise的实例:

fetch(url)
    .then(res=>res.json())
    .then(result=> {......})
    .then(result=>{.....})

没错,都是链式调用的经典场景,能够一直的.下去,很爽,也很好解读,其背后有什么魔法呢?

链接调用的本质

本质

  1. 返回同类型的对象
  2. 返回当前实例本身
  • Promise的then是典型的返回同类型的对象Promise的实例,
  • 数组返回的也是同类型的实例
  • jQuery是两者的结合体, 依据不同情况,返回的可能是当前实例本身,也可能是同类型的对象。

那我们一起看看返回自身的例子:

const EventEmitter = require("events");
const emitter = new EventEmitter();

emitter.on("message", function(){
    console.log("message")
}).on("message1", function(){
    console.log("message1")
})


emitter.emit("message"); // message
emitter.emit("message1"); // message1

没错,就是返回自身的情况。

链式调用的优缺点

优点

  • 减少代码量
    因为省略了前面变量的抒写。
  • 逻辑晰明
    方法见名之意的话,轻轻松松的就能看懂逻辑。
    比如map, filter, some等等这种,好耶。
  • 易维护
    代码少了,逻辑清晰了,自然方便了维护啦。

缺点

  • 复杂度变高
  • 排查问题难度增加

一起实现一个MyMath库

class Calculator {

    constructor(val) {
        this.val = val;
    }

    double() {
        this.val = this.val * 2;
        return this
    }

    add(num){
        this.val = this.val + num;
        return this
    }

    minus(num){
        this.val = this.val - num;
        return this
    }

    multi(num){
        this.val = this.val* num;
        return this
    }

    divide(num){
        this.val = this.val / num;
        return this 
    }

    pow(num){
        this.val = Math.pow(this.val, num);
        return this 
    }

    get value() {
        return this.val;
    }

}

测试代码:

const cal = new Calculator(10);

const val = cal.add(10) // 20
    .minus(5) // 15
    .double() // 30
    .multi(10) // 300
    .divide(2) // 150
    .pow(2)   // 2250
    .value;
console.log(val); // 2250

是不是看起来,很简便,666啊。

适合的场景

数据的流水加工和集中处理。 毕竟嘛,函数主要作用是处理数据。

管道组合

链式调用,其实一定程度降低了代码复用,没错!
于是有另外一种编程概念, 管道组合。

管道组合,不必把数据加工的函数在同一个对象或者类上编写,只需要把他们编排组合,然后按照流程执行,真的是666啊。

管道组合实现Calculator

等你来做哦

小结

链接调用是一种思路, 管道组合也是一种思想,思想回了,灵活使用才是关键。 你说对嘛? 今天你收获了吗?