promise 的原理以及拓展

127 阅读1分钟

函数颗粒化

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);