前言
-
本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。
-
这是源码共读的第14期,链接:juejin.cn/post/708315… 。
学习目标
- 学习 promisify 的原理和实现
- 学习获取 git 仓库所有 tags 的原理
- shell相关使用场景
关于promisify
-
是什么?
- 是介于callback方式和promise方式之间的桥梁,promisify让callback方式的写法可以使用promise的链式写法实现;
- 用promise的方法防止了callback的回调地狱
-
使用场景?
- 使用了callback的封装函数,希望返回是是promise结果的情况;
-
怎么使用?
- 封装promisify函数,
- node工具包中带了promisify函数,import {promisify} from 'node:util';
- 可以使用第三方库 import {promisify} from 'bluebird';
-
本质上就是拦截callback的结果,err情况返回promise的reject状态,否则返回resolve状态及结果
-
代码
function promisify(originFn) {
return function fn(...args) {
return new Promise((resolve, reject) => {
args.push((err, data) => {
err ? reject(err) : resolve(data);
});
//改变this执行
Reflect.apply(originFn, this, args);
});
};
}
关于获取git tags的原理
- 是什么? 从远程获取所有tag及版本号
- 原理
- 通过git ls-remote --tags 远程仓库地址 获取到以\n换行的字符串,切割后存储为Map形式;
- 由于命令需要在shell中运行,所以代码使用到了node的childProcess.exec去执行shell中的命令
- 如何使用?
关于shell
-
是什么?
- Bash Shell Script,是bash脚本文件,用来执行bash(安装git自带bash shell),或者cmd,powerShell等
- 本质就是把在cmd,powershell,bash等shell上的一系频繁的命令操作,可以放到一个.sh文件中,类似与封装一个函数执行相关的操作;
-
使用场景?
- 用shell脚本批量移动, 删除或重命名文件;
- 复杂命令步骤简单化(git提交步骤集成到sh文件中,简化步骤)
- 自动打包、编译、发布等
- 清理特定条件的文件
- 如何使用?
- 方法一:直接双击该.sh文件
- 方法二:在powershell或者bash控制台中,./git_submit.sh (当前文件所在目录)
总结
- 学习了如何把callback回调函数转为promise的方法;
- 通过库学习到了
git ls-remote --tags 远程仓库地址命令可以获取到所有tags; - 了解了shell的使用;