zoukankan      html  css  js  c++  java
  • js的组合函数

    1.组合函数即由若干个函数组合成一个新的函数,同时完成数据的传递

    1>最简单版本

      这种方法实现的组合函数,需要我们指定函数的执行顺序

    /**第一种方法 */
    function add(a, b) {
        return a + b;
    }
    function square(a) {
        return a * a;
    }
    
    function compose(fn1, fn2) {
        return (...args) => fn1(fn2(...args));
    }
    
    
    console.log(compose(square, add)(1, 2));

    2>升级版本

      此种方法可以顺序执行我们输入的函数

    
    
      /**第二种方法 可以按照顺序执行*/
    function compose2(mids) {
        return (...args) => {
            let ret = mids[0](...args);
            for (let i = 1; i < mids.length; i++) {
                ret = mids[i](ret);
            }
            return ret;
        }
    }
    console.log(compose2([add, square])(1, 2));

    3>当我们的某些函数需要异步执行的时候,可以使用下面的方法,用next来完成函数的下一步操作  (类似于koa异步函数的实现过程)

        思路:异步的实现需要借助Promise,函数必须返回一个Promise

    function sleep() {
        return new Promise((resolve) => {
            setTimeout(() => {
                resolve();
            }, 2000);
        })
    }
    async function fn1(next) {
        console.log('fn1');
        setTimeout(() => {
            console.log('fn1 settimeout');
    
        }, 1000);
        await next();
        console.log('end fn1');
    }
    async function fn2(next) {
        console.log('fn2');
        await sleep();
        await next();
        console.log('end fn2');
    }
    async function fn3(next) {
        console.log('end fn3');
    }
    
    function compose(mids) {
        return function () {//最终组合结果函数
            //执行第0个
            return dispatch(0);
            //需要返回Promise
            function dispatch(i) {
                let fn = mids[i];
                if (!fn) {
                    //执行任务结束
                    return Promise.resolve();
                }
                return Promise.resolve(fn(function next() {
                    return dispatch(i + 1);
                }));
            }
        }
    }
    
    compose([fn1, fn2, fn3])().then(() => console.log("任务执行结束"));

    最终的执行结果是: 

    fn1
    fn2
    fn1 settimeout
    end fn3
    end fn2
    end fn1

  • 相关阅读:
    python----面对对象三大特征2
    python---面对对象的三大特征
    python---面对对象的组合
    python----特殊闭包
    python----面向对象初识
    Nginx配置upstream实现负载均衡
    Nginx的配置与部署研究,Upstream负载均衡模块
    百度地图传经纬度位置显示
    ip转城市接口,ip转省份接口,ip转城市PHP方法
    PHP把采集抓取网页的html中的的&nbsp;去掉或者分割成数组
  • 原文地址:https://www.cnblogs.com/yinping/p/10722605.html
Copyright © 2011-2022 走看看