【源码共读】第14期 | promisify

181 阅读2分钟

前言

学习目标

  • 学习 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文件中,简化步骤)
    • 自动打包、编译、发布等
    • 清理特定条件的文件

image.png

  • 如何使用?
    • 方法一:直接双击该.sh文件
    • 方法二:在powershell或者bash控制台中,./git_submit.sh (当前文件所在目录)

总结

  1. 学习了如何把callback回调函数转为promise的方法;
  2. 通过库学习到了git ls-remote --tags 远程仓库地址 命令可以获取到所有tags;
  3. 了解了shell的使用;