第14期 | promisify

158 阅读1分钟

remote-git-tags 源码收获

主文件

import { promisify } from 'node:util';
import childProcess from 'node:child_process';

const execFile = promisify(childProcess.execFile)

export default async function remoteGitTags(repoUrl){
    const { stdout } = await execFile('git',['ls-remote','--tags',repoUrl])
    const tags = new Map()
    for(const line of stdout.trim().split('\n')){
        const [hash,tagReference] = line.split('\t')
        const tagName = tagReference.replace(/^refs\/tags\//,'').replace(/\^{}$/,'')
        tags.set(tagName,hash)
    }
    return tags
}

主文件挺简单的一看就懂了,通过字符串分割以后,通过正则将tagName和hash分割出来,以tagName作为key,hash作为value存储在Map对象中。

promisify

  • 作用:将callback形式转换为Promise对象
  • Node中异步回调中有个约定:Error first,回调函数中的第一个参数一定是Error对象,其余参数才是正确的数据。
function promisify(original){
   return function fn(...args){
        return new Promise((resolve, reject) => {
            args.push((err,...values) => {
                if(err){
                    return reject(err)
                }
                resolve(values)
            })
            Reflect.apply(original,this,args)
        
        })
    }
}

收获

这次这个主文件比较简单,就是用调试工具来走了下流程,最大的收获是学会了手写简易版的promisify,继续努力