【30秒一个知识点】Adapter(二)
时间:2022-06-21
本文章向大家介绍【30秒一个知识点】Adapter(二),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本系列翻译自开源项目 30-seconds-of-code 这是一个非常优秀的系列,不是说真的三十秒就能理解,也需要你认真的思考,其中有一些点非常精妙,很值得一读。 本文在我的github同步更新,点击文章末尾阅读全文你可以看到当前翻译的全部系列。
overArgs
创建一个函数,它可以调用提供的被转换参数的函数。
使用 Array.prototype.map()
将 transforms
应用于 args
,并结合扩展运算符( …
)将转换后的参数传递给 fn
。
const overArgs = (fn, transforms) => (...args) => fn(...args.map((val, i) => transforms[i](val)));
示例
const square = n => n * n;
const double = n => n * 2;
const fn = overArgs((x, y) => [x, y], [square, double]);
fn(9, 3); // [81, 6]
pipeAsyncFunctions
为异步函数执行从左到右的函数组合。
在扩展操作符( …
)中使用 Array.prototype.reduce()
来使用 Promise.then()
执行从左到右的函数组合。 这些函数可以返回简单值、 Promise
的组合,也可以定义为通过 await
返回的 async
值。 所有函数必须是一元的。
const pipeAsyncFunctions = (...fns) => arg => fns.reduce((p, f) => p.then(f), Promise.resolve(arg));
示例
const sum = pipeAsyncFunctions(
x => x + 1,
x => new Promise(resolve => setTimeout(() => resolve(x + 2), 1000)),
x => x + 3,
async x => (await x) + 4
);
(async() => {
console.log(await sum(5)); // 15 (after one second)
})();
pipeFunctions
执行从左到右的函数组合。
在展开操作符( …
)中使用 Array.prototype.reduce()
来执行从左到右的函数组合。 第一个(最左边的)函数可以接受一个或多个参数; 其余的函数必须是一元的。
const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args)));
示例
const add5 = x => x + 5;
const multiply = (x, y) => x * y;
const multiplyAndAdd5 = pipeFunctions(multiply, add5);
multiplyAndAdd5(5, 2); // 15
promisify
把一个异步函数转换成返回promise的。
使用局部套用返回一个函数,该函数返回一个调用原始函数的 Promise
。 使用的 ...
操作符来传入所有参数。
const promisify = func => (...args) =>
new Promise((resolve, reject) =>
func(...args, (err, result) => (err ? reject(err) : resolve(result)))
);
示例
const delay = promisify((d, cb) => setTimeout(cb, d));
delay(2000).then(() => console.log('Hi!')); // Promise resolves after 2s
rearg
创建一个调用提供的函数的函数,该函数的参数按照指定的索引排列。
利用 Array.prototype.map()
根据 indexes
和展开操作符 ( ...
) 对参数进行重新排序,将转换后的参数传递给 fn
.
const rearg = (fn, indexes) => (...args) => fn(...indexes.map(i => args[i]));
示例
var rearged = rearg(
function(a, b, c) {
return [a, b, c];
},
[2, 0, 1]
);
rearged('b', 'c', 'a'); // ['a', 'b', 'c']
- Python时间处理完全手册
- 计算机程序的思维逻辑 (15) - 初识继承和多态
- 前端自动化测试漫长路之——Selenium初探
- 计算机程序的思维逻辑 (14) - 类的组合
- webpack中tree-shaking技术介绍
- Python进行远程视频监控
- 好用的前端页面性能检测工具—sitespeed.io
- 计算机程序的思维逻辑 (13) - 类
- 新浪微博爬虫最新分享
- Unity Application Block 3月12 发布的版本
- HTTPS静态服务搭建过程详解
- 基于Webkit的浏览器关键渲染路径介绍
- CodePlex 全面支持Subversion/TortoiseSVN
- 计算机程序的思维逻辑 (11) - 初识函数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下查看NVIDIA的GPU使用情况
- 数据结构算法操作试题(C++/Python)——有效的数独
- Java List.addAll()方法:添加所有元素到列表中
- HDFS的Shell操作(开发重点)
- 数据结构算法操作试题(C++/Python)——字符串相乘
- Java基础知识笔记四(详细)
- [推荐]Linux入门系列(三)Vim编辑器(Vim工作模式+代码演示)
- 机器学习性能评价指标汇总
- [推荐]Linux入门系列(四)系统用户账号管理(代码图文示例)
- 逆波兰表达式
- 字符串:替换空格
- 字符串:花式反转还不够!
- 字符串:反转个字符串还有这个用处?
- 字符串: KMP是时候上场了(一文读懂系列)
- 字符串:都来看看KMP的看家本领!