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
js的组合函数的更多相关文章
- 使用js 设置组合快捷键
使用js 设置组合快捷键 使用js设置快捷键的本质就是获得你要设置的这个键的keyCode 的值,如果要加ctrl,alt,shift,那么就添加一个ctrlkey,altKey,shiftKey来判 ...
- js 排列 组合 的一个简单例子
最近工作项目需要用到js排列组合,于是就写了一个简单的demo. 前几天在网上找到一个写全排列A(n,n)的code感觉还可以,于是贴出来了, 排列的实现方式: 全排列主要用到的是递归和数组的插入 比 ...
- js中的函数应用
js中的函数应用 什么是函数,函数的概念 函数就像一个黑匣子,里面的东西你都不知道,但是你提供一些材料放进去,他可以制造出你需要的东西; 可以让多个一样的功能封装组合起来,然后想执行几次就执行几次 函 ...
- Node.js 教程 06 - 函数
前言: 本篇介绍的是Node.js中的函数,相对于上一篇会简单一点,其实和我们Javascript中的function无异. 好了,废话不多说了,我们进入正题吧. Node.js函数: [示例1:创建 ...
- 关于js的回调函数的一点看法
算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做nativ ...
- js立即执行函数
一.JS立即执行函数的写法 方式1.最前最后加括号 (function(){alert(1);}()); 方式2.function外面加括号 (function(){alert(1);})(); ...
- js 数组处理函数
本文转载自有有<js 数组处理函数> concat 将参数列表连接到原数组后面形成一个新的数组并返回,原有数组不受影响. var arr = ["a","b& ...
- JS字符串替换函数:Replace(“字符串1″, “字符串2″),
JS字符串替换函数:Replace(“字符串1″, “字符串2″), 1.我们都知道JS中字符串替换函数是Replace(“字符串1″, “字符串2″),但是这个函数只能将第一次出现的字符串1替换掉, ...
- js使用split函数按照多个字符对字符串进行分割的方法
这篇文章主要介绍了js使用split函数按照多个字符对字符串进行分割的方法,实例分析了split函数的使用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了js使用split函数按照多个 ...
随机推荐
- ubuntu16下面安装vmware tools后仍然未全屏问题
1.默认下载ubuntu16的iso镜像后,自带的有vmtools.解压 tar -xzvf VMwareTools-10.0.6-3595377.tar.gz 进入解压目录. 执行:sudo ./ ...
- TF-IDF与余弦相似性的应用:找出相似文章
"找出相似文章"的一种算法: 利用TF-IDF算法,找出两篇文章的关键词. 每篇文章若干个关键词的相对词频. 生成两篇文章各自的词频向量. 计算两个向量的余弦相似度,值越大就表示越 ...
- 类型“Microsoft.Office.Interop.Word.ApplicationClass”错误 4317 无法嵌入互操作类型
类型“Microsoft.Office.Interop.Word.ApplicationClass”错误 4317 无法嵌入互操作类型“Microsoft.Office.Interop.Word.Ap ...
- [翻译] VICMAImageView
VICMAImageView https://github.com/vitoziv/VICMAImageView Change image view's content mode with your ...
- 装饰器( decorate )
装饰器分步解释-形成过程: #-*- coding: UTF-8 -*- #示例1: def deco(p_args): def pack(): print('haha,i am deco fun') ...
- Linux NFS 详解
目录: 1.了解NFS服务 2.NFS主要文件 3.NFS安装 4.NFS配置 5.NFS客户端配置 6.固定NFS端口 7.Windows挂 ...
- 套接字和标准I/O缓冲区
设置标准I/O函数缓冲区的主要目的是为了提高性能.但套接字中的缓冲主要是为了实现TCP协议而设立的.例如,TCP传输中丢失数据时将再次传递,而再次发送数据则意味着在某地保存了数据.存在什么地方呢?套接 ...
- August 01st 2017 Week 31st Tuesday
A contented mind is the greatest blessing a man can enjoy in this world. 知足是人生在世最大的幸事. Being content ...
- 初进MFC的世界,太奇妙。第六次作业----未完待续
又一次的迁徙.我希望能够早些抵达. 第六次作业-未完待续!图形界面,计算器文件 本次的作业是给自己的计算器加一个可视化的窗口,我开始也是很激动和憧憬的,看了很多的界面库,发现并没有想象的那么简单,因为 ...
- git修改远程仓库
三种方式都可以. 1. 修改命令 git remte origin set-url URL 2.先删后加 git remote rm origin git remote add origin git@ ...