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

js的组合函数的更多相关文章

  1. 使用js 设置组合快捷键

    使用js 设置组合快捷键 使用js设置快捷键的本质就是获得你要设置的这个键的keyCode 的值,如果要加ctrl,alt,shift,那么就添加一个ctrlkey,altKey,shiftKey来判 ...

  2. js 排列 组合 的一个简单例子

    最近工作项目需要用到js排列组合,于是就写了一个简单的demo. 前几天在网上找到一个写全排列A(n,n)的code感觉还可以,于是贴出来了, 排列的实现方式: 全排列主要用到的是递归和数组的插入 比 ...

  3. js中的函数应用

    js中的函数应用 什么是函数,函数的概念 函数就像一个黑匣子,里面的东西你都不知道,但是你提供一些材料放进去,他可以制造出你需要的东西; 可以让多个一样的功能封装组合起来,然后想执行几次就执行几次 函 ...

  4. Node.js 教程 06 - 函数

    前言: 本篇介绍的是Node.js中的函数,相对于上一篇会简单一点,其实和我们Javascript中的function无异. 好了,废话不多说了,我们进入正题吧. Node.js函数: [示例1:创建 ...

  5. 关于js的回调函数的一点看法

    算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做nativ ...

  6. js立即执行函数

    一.JS立即执行函数的写法 方式1.最前最后加括号 (function(){alert(1);}()); 方式2.function外面加括号   (function(){alert(1);})(); ...

  7. js 数组处理函数

    本文转载自有有<js 数组处理函数> concat 将参数列表连接到原数组后面形成一个新的数组并返回,原有数组不受影响. var arr = ["a","b& ...

  8. JS字符串替换函数:Replace(“字符串1″, “字符串2″),

    JS字符串替换函数:Replace(“字符串1″, “字符串2″), 1.我们都知道JS中字符串替换函数是Replace(“字符串1″, “字符串2″),但是这个函数只能将第一次出现的字符串1替换掉, ...

  9. js使用split函数按照多个字符对字符串进行分割的方法

    这篇文章主要介绍了js使用split函数按照多个字符对字符串进行分割的方法,实例分析了split函数的使用技巧,非常具有实用价值,需要的朋友可以参考下   本文实例讲述了js使用split函数按照多个 ...

随机推荐

  1. Raspberry install wine

    sudo apt install wine winecfg出现问题 树莓派3B是卡片电脑,内存为1GB,一般运行Linux.Linux两种主流的内存分配方法2G/2G和3G/1G,树莓派系统后期优化性 ...

  2. sqlserver 查询表结构及字段说明

    SELECT [Table Name] = OBJECT_NAME(c.object_id), [Column Name] = c.name, [Description] = ex.value FRO ...

  3. js变量作用域--变量提升

    1.JS作用域 在ES5中,js只有两种形式的作用域:全局作用域和函数作用域,在ES6中,新增了一个块级作用域(最近的大括号涵盖的范围),但是仅限于let方式申明的变量. 2.变量声明 var x; ...

  4. C# 递归函数详细介绍及使用方法

    什么是递归函数/方法? 任何一个方法既可以调用其他方法也可以调用自己,而当这个方法调用自己时,我们就叫它递归函数或递归方法. 通常递归有两个特点: 1. 递归方法一直会调用自己直到某些条件被满足 2. ...

  5. js中问号

    是三目运算,如:(a==b)?a:b 也就是说,先判断a是否等于b,如果是(true),那么返回a,如果否(false),则返回b greeting=(visitor=="PRES" ...

  6. VC listBox控件的方法

    获取listBox里所有行数 GetCount(); 设置某行的选中状态 SetSel(index,true);第一个参数是行号,第二个参数是否选中

  7. Python学习---Python的框架基础学习

    框架基础 框架实质: 所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 B/S结构的响应: import socket def handle_requ ...

  8. centos6.3_gcc安装软件及流程

    分享链接下载文件上传安装即可 链接:https://pan.baidu.com/s/15eUhm9LTUdHDPkXOyRb9Tg 密码:tohr # 文件内置安装脚本,直接安装即可 [root@lo ...

  9. zabbix监控服务器时间问题

    zabbix中有自带对linux服务器时间进行监控的模板,用的key是system.localtime返回当前的系统时间,而配置tigger报警时是用的fuzzytime(N)方法,该方法是将返回的系 ...

  10. HTTP协议图--HTTP 协议报文结构

    1.HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文.请求端(客户端)的 HTTP 报文叫做请求报文:响应端(服务器端)的叫做响应报文.HTTP 报文本身是由多行(用 CR[car ...