函数颗粒化
function isType(type,value){
return Object.prototype.toString.call(value) === `[object ${type}]`;
}
const currying = (fn, arr = []) => {
let len = fn.length;
return function(...args){
let concatValue = [...arr, ...args];
if(concatValue.length < len){
return currying(fn,concatValue);
}else{
return fn(...concatValue);
}
}
}
let isArray = currying(isType)('Array');
什么是高阶函数: 1,如果一个函数的参数是一个函数,回调函数就是一种高阶函数 2. 如果一个函数返回一个函数,那么这个返回的函数就是高阶函数
高阶函数应用场景。写了一个业务代码, 扩展当前的业务代码, 但是不能改变当前的业务代码
function say(a,b){
console.log(a,b);
}
Function.prototype.before = function(callback) {
return (...args)=>{
callback();
this(...args);
}
}
let beforeSay = say.before(function(){
console.log('say');
});
beforeSay('hello','world');
如何在并发异步请求拿到数据
let school = {};
function after(times,callback){
return function(){
if(--times === 0){
callback();
}
}
};
let cd = after(2,function(){
console.log(school);
});
setTimeout(()=>{
school.name = 1;
},1000);
setTimeout(()=>{
school.name = 2;
},1000);
上面这种处理方式,不是很妥当,下面这种发布订阅者才是最好的
arr:[],
on(fn){
this.arr.push(fn);
},
emit(){
this.arr.forEach(fn=>fn());
}
};
let school = {};
events.on(function(){
console.log('读取了一个');
});
events.on(function(){
if(Object.keys(school).length === 2){
console.log(school, 'school');
}
});
setTimeout(()=>{
events.emit();
},1000)
setTimeout(()=>{
events.emit();
},1000)
接下来说下发布订阅者和观察者模式的区别,发布订阅者相当于中间件,观察者模式其实是基于发布订阅者的,被观察者里面就是发布订阅者,
constructor(name){
this.name = name;
this.state = '开心的';
this.observers = [];
}
attach(o){
this.observers.push(o);
}
setState(newState){
this.state = newState;
this.observers.forEach(o=>o.update(this));
}
}
class Observer{
constructor(name){
this.name = name;
}
update(){
}
}
let bady = new Subject('小宝宝');
let parent = new Observer('爸爸');
bady.attach(parent);