对标阿里-Promise 源代码解析

本文深入剖析Promise的源代码,适合熟悉Promise使用并希望深入了解其实现的开发者。文章从构建过程开始,详细解读了build.js如何处理源代码,生成lib目录。接着分析了Promise的核心文件core.js,解释了Promise的状态、工具函数、resolve和reject的工作原理,以及then方法的实现机制,揭示了Promise的执行流程。
摘要由CSDN通过智能技术生成

本文从 Promise 的源代码入手,分析Promise是如何实现的。并不涉及Promise如何使用.
适用于已经熟悉使用Promise,同时希望深入了解Promise的开发人员

构建

从package.json中不难找到build相关的命令都在从build.js中实现
同时分析根目录下的index.js和core.js发现,代码的引用都是lib目录,但初始的源代码中却没有这个目录,大致猜测应该是从build.js中生成的.

ok 让我们进入build.js
首先分析下引用的几个库

fs - 文件操作
rimraf - 彻底删除某个文件夹的命令 相当于 rm -rf 
Acorn - 一个javascript的解析器 

进入代码,首先跳过2个函数定义 fixup/gitIdfor.

rimraf.sync(__dirname + '/lib/');
fs.mkdirSync(__dirname + '/lib/');
fs.readdirSync(__dirname + '/src').forEach(function (filename) {
  var src = fs.readFileSync(__dirname + '/src/' + filename, 'utf8');
  var out = fixup(src);
  fs.writeFileSync(__dirname + '/lib/' + filename, out);
});

这里代码删除并重新建立了lib目录,然后把src下的代码文件拷贝到了lib目录下。 在拷贝之前仅仅做了一次fixup的处理,这fixup中到底发生了什么?

首先看getIdFor, 对每个进入的name都随机生成一个对应的由下划线开头连接2位数字的随机id 并返回.

然后看Fixup, 对进入的代码进行分析,获得每个节点的属性,并将其名字替换为id, 这点上比较像混淆。

通过对代码分析也找到最终的解释:

// All `_` prefixed properties will be reduced to `_{random number}`
// at build time to obfuscate them and discourage their use.
// We don't use symbols or Object.defineProperty to fully hide them
// because the performance isn't good enough.

// build的时候会把所有的预定义的属性转变为 `_{随机数}的形式做混淆,不鼓励直接使用他们
// 我们不使用Object.defineProperty去隐藏属性因为那会降低效率

编译的过程到这里可以说完成了,但build.js中把上面的过程又进行了两边,额外生成了两个目录 domains 和 setimmediate。 唯一的区别是,把其中的 asap/raw库分别换成了 asapsetImmediate

那这个asap/rawasap还有setimmediate的区别是什么呢?

共同点,都是立即对参数中的函数进行异步调用
不同点:

  1. asap 比 setimmediate 调用更快,而且调用的时候会阻止其他事件的处理 (默认)
  2. asap/raw 和asap运行的原理一样,但不处理运行抛出的异常 (换来更多效率), 同时也支持不同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值