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

  • 相关阅读:
    【图灵学院09】RPC底层通讯原理之Netty线程模型源码分析
    【图灵学院10】高并发之java线程池源码分析
    【图灵学院02】大型互联网技术之数据库分库分表
    【图灵学院01】Java程序员开发效率工具IntelliJ IDEA使用
    【OD深入学习】Java多线程面试题
    高级工程师->架构师
    架构师成长之路
    python--openCV--鼠标事件
    python--openCV--视频处理
    python--openCV
  • 原文地址:https://www.cnblogs.com/yinping/p/10722605.html
Copyright © 2011-2022 走看看