小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
用过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=>{.....})
没错,都是链式调用的经典场景,能够一直的.下去,很爽,也很好解读,其背后有什么魔法呢?
链接调用的本质
本质
- 返回同类型的对象
- 返回当前实例本身
- 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
等你来做哦
小结
链接调用是一种思路, 管道组合也是一种思想,思想回了,灵活使用才是关键。 你说对嘛? 今天你收获了吗?