• 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

  • 相关阅读:
    redis-cluster的实例动态调整内存
    nginx upstream的五种分配方式
    cdn、回源等问题
    gpu机器安装nvidia-smi和python的tensorflow-gpu模块
    Hadoop、HBase、Spark单机安装
    数学的概念
    Eclipse 2020版安装&初始化
    191002一些岗位数量统计
    现象:SpringApplication.run后面的语句未执行
    Ubuntu 18.04安装docker
  • 原文地址:https://www.cnblogs.com/yinping/p/10722605.html
Copyright © 2020-2023  润新知