美文网首页
责任链模式

责任链模式

作者: 罗不错 | 来源:发表于2020-07-15 16:47 被阅读0次

责任链模式只能用于处理所有函数处理同一份参数的情况, 比如改造多个if else
函子模式,可以传递值,如对一个对象进行解析
currying化中,涉及到三个上下文: 载体函数self1,被执行函数self2,执行函数self3




function A(fn){
  let self1= this
  return function(){
       let self2 = fn
       let self3 = this
  }
}
   Function.prototype.before = function (fn) {
        var self = this
        // fn为当前方法, self为上个方法, 
        // 从左到右依次执行,应该是self.apply先执行
        // 从右到左逆执行, 应该是fn先执行
        return function () {
          var ret = fn.apply(this, arguments) 
          if (ret === 'prev') {
            return self.apply(this, arguments)
          }
          return ret
        }
      }
      Function.prototype.after = function (fn) {
        var self = this
        // fn为当前方法, self为上个方法, 
        // 从左到右依次执行,应该是self.apply先执行
        // 从右到左逆执行, 应该是fn先执行
        return function () {
          var ret = self.apply(this, arguments) 
         // ret不能用传递前后参数,只能用于控制是否执行下一步,  fn1和fn2可以传递参数,但fn2和fn3传递不了,只能借用外置对象来处理
          if (ret === 'next') {
            return   fn.apply(this, arguments) 
          }
          return ret
        }
      }  

    function A(type){
        if(type!="A"){
          return 'prev'
        }
        return 'nullA'
    }
    function B(type){
        if(type!="B"){
          return 'prev'
        }
        return 'nullB'
    }
    function C(type){
        if(type!="C"){
          return 'prev'
        }
        return 'nullC'
    }

    let order = A.before(B).before(C)('B')

    console.log(order)


    function A2(type){
        if(type!="A"){
          return 'next'
        }
        return 'nullA'
    }
    function B2(type){
        if(type!="B"){
          return 'next'
        }
        return 'nullB'
    }
    function C2(type){
        if(type!="C"){
          return 'next'
        }
        return 'nullC'
    }
    let order2 =A2.after(B2).after(C2)('C')
    console.log(order2)


  //异步函数的改写
  Function.prototype.after = function (fn) {
        var self = this
        // fn为当前方法, self为上个方法, 
        // 从左到右依次执行,应该是self.apply先执行
        // 从右到左逆执行, 应该是fn先执行
        return async function () {
          var ret =await self.apply(this, arguments)
          if (ret === 'next') {
            return await fn.apply(this, arguments)
          }
          return ret
        }
      }
      async function Fn1(param) {
        let res = await new Promise((re, rj) => {
          setTimeout(() => {
            let val = true
            console.log(param+'Fn1')
            
            re(val)
          }, 1000)
        })
         
        return res ? 'next' : false
      }
      async function Fn2(param) {
        let res = await new Promise((re, rj) => {
          setTimeout(() => {
            let val = true
            console.log(param+'Fn2')
            re(val)
          }, 1000)
        })
         
        return res ? 'next' : false
      }
      async function Fn3(param) {
        let res = await new Promise((re, rj) => {
          setTimeout(() => {
            let val = true
            console.log(param+'Fn3')
            re(val)
          }, 1000)
        })
         
        return res ? 'next' : false
      }


      console.log(Fn1.after(Fn2).after(Fn3)('test'))


// 函子写法
  function Container (val){
         this.value=val 
       }
         Container.prototype.map=async function(fn){ 
         return  Container.of(await fn(this.value))
       }    
       Container.of= function(val){
          return  new Container(val)
       }
  
      async function Fn1(param) {
        let res = await new Promise((re, rj) => {
          setTimeout(() => {
            let val = true
            console.log(param+'Fn1')
            re(val)
          }, 1000)
        })
         
        return res ? 'next' : false
      }
      async function Fn2(param) {
        let res = await new Promise((re, rj) => {
          setTimeout(() => {
            let val = true
            console.log(param+'Fn2')
            re(val)
          }, 1000)
        })
         
        return res ? 'next' : false
      }
      async function Fn3(param) {
        let res = await new Promise((re, rj) => {
          setTimeout(() => {
            let val = true
            console.log(param+'Fn3')
            re(val)
          }, 1000)
        })
         
        return res ? 'next' : false
      }
    
       let obj = Container.of('test')
       let res1 = await obj.map(Fn1)
       let res2 = await res1.map(Fn2)
       let res3 = await res2.map(Fn3)

相关文章

网友评论

      本文标题:责任链模式

      本文链接:https://www.haomeiwen.com/subject/oltsqktx.html