promise源码解析
前言
大部分同学对promise,可能还停留在会使用es6的promise,还没有深入学习。我们都知道promise内部通过reslove、reject来判断执行哪个函数,原型上面的then同样的,也有成功回调函数跟失败回调函数。
这篇文章,我们来讲讲promise的源码,从源码来分析,promise的原理。Tip: 阅读源码是枯燥的
使用
使用es6的promise常用的方式有两种:
1、使用CDN 引入方式,我们在html中引入es6-promise.js、es6-promise.auto.js这两个js文件,就可以使用了。
2、通过node安装方式,有两种安装方式:
yarn add es6-promise
or
npm install es6-promise
安装完成后就可以使用了,比如:var Promise = require('es6-promise').Promise; Tip: 如果要在Node或浏览器中通过CommonJS填充全局环境,请使用以下代码段:
require('es6-promise').polyfill();
require('es6-promise/auto');
这里不会将结果分配polyfill ()
给任何变量。该polyfill ()
方法将Promise
在调用时修补全局环境。
分析
声明Promise
var Promise$ = function () {
function Promise(resolver) {
this[PROMISE_ID] = nextId();
this._result = this._state = undefined;
this._subscribers = []; if (noop !== resolver) {
typeof resolver !== 'function' && needsResolver();
this instanceof Promise ? initializePromise(this, resolver) : needsNew();
}
}
从代码上可以看出跟promise交互的主要方式是通过其`then`方法,它会记录回调用来接收promise的最终值或者promise无法履行的原因。
我们来看看resolve方法:
function resolve$(object) {
/*jshint validthis:true */
var Constructor = this; if (object && typeof object === 'object' && object.constructor === Constructor) {
return object;
} var promise = new Constructor(noop);
resolve(promise, object);
return promise;
}
function resolve(promise, value) {
// 首先一个Promise的resolce结果不能是自己 (自己返回自己然后等待自己,循环)
if (promise === value) {
reject(promise, selfFulfillment());
} else if (objectOrFunction(value)) {
// 当新的值存在,类型是对象或者函数的时候
handleMaybeThenable(promise, value, getThen(value));
} else {
// 最终的结束流程,都是进入这个函数
fulfill(promise, value);
}
}
`Promise.resolve`会返回一个将被resolve的promise传递了“value”。 我们可以用下面的简写:
let promise = Promise.resolve();
promise.then(function(value){
// value === 1
});
最后看下then方法:
Promise.prototype.then = function (didFulfill, didReject) {
if (debug.warnings() && arguments.length > &&
typeof didFulfill !== "function" &&
typeof didReject !== "function") {
var msg = ".then() only accepts functions but was passed: " +
util.classString(didFulfill);
if (arguments.length > ) {
msg += ", " + util.classString(didReject);
}
this._warn(msg);
}
return this._then(didFulfill, didReject, undefined, undefined, undefined);
};
总结:
promise执行步骤如下:
1、 首先创建Promise
2、 然后设置需要执行的函数
3、 接着设置完成的回调
4、 跟着开始执行函数
5、 最后根据执行结果选择回调
promise源码解析的更多相关文章
- Netty 源码解析(三): Netty 的 Future 和 Promise
今天是猿灯塔“365篇原创计划”第三篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel 当前:Ne ...
- jQuery2.x源码解析(回调篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 通过艾伦的博客,我们能看出,jQuery的pro ...
- Koa2 源码解析(1)
Koa2 源码解析 其实本来不想写这个系列文章的,因为Koa本身很精简,一共就4个文件,千十来行代码. 但是因为想写 egg[1] 的源码解析,而egg是基于Koa2的,所以就先写个Koa2的吧,用作 ...
- jQuery2.x源码解析(DOM操作篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) jQuery这个类库最为核心重要的功能就是DOM ...
- co源码解析
一.co函数是什么 co 函数库是著名程序员 TJ Holowaychuk 于2013年6月发布的一个小工具,用于 Generator 函数的自动执行.短小精悍只有短短200余行,就可以免去手动编写G ...
- Netty 4源码解析:服务端启动
Netty 4源码解析:服务端启动 1.基础知识 1.1 Netty 4示例 因为Netty 5还处于测试版,所以选择了目前比较稳定的Netty 4作为学习对象.而且5.0的变化也不像4.0这么大,好 ...
- Netty5客户端源码解析
Netty5客户端源码解析 今天来分析下netty5的客户端源码,示例代码如下: import io.netty.bootstrap.Bootstrap; import io.netty.channe ...
- Netty5服务端源码解析
Netty5源码解析 今天让我来总结下netty5的服务端代码. 服务端(ServerBootstrap) 示例代码如下: import io.netty.bootstrap.ServerBootst ...
- redux的源码解析
一. redux出现的动机 1. Javascript 需要管理比任何时候都要多的state2. state 在什么时候,由于什么原因,如何变化已然不受控制.3. 来自前端开发领域的新需求4. 我们总 ...
随机推荐
- 《前端之路》之 Cookie && localStorage && Session Storage 缓存相关
08: Cookie && localStorage && Session Storage 缓存相关 客户端.前端 存储 一. 起 因 首先解释下为什么想来写这个关于前 ...
- Navicat 导出sql问题
楼主最近碰到一个问题: 使用Navicat建立数据模型的时候使用导出sql功能导出的sql脚本放在sqlserver中执行失败,表创建成功了,但是我在Navicat中写的表注释和字段注释都没有成功, ...
- C#利用NPOI操作Excel文件
NPOI作为开源免费的组件,功能强大,可用来读写Excel(兼容xls和xlsx两种版本).Word.PPT文件.可是要让我们记住所有的操作,这便有点困难了,至此,总结一些在开发中常用的针对Excel ...
- Redis协议规范(RESP)
Redis 即 REmote Dictionary Server (远程字典服务): 而Redis的协议规范是 Redis Serialization Protocol (Redis序列化协议) 该协 ...
- SLAM+语音机器人DIY系列:(三)感知与大脑——5.机器人大脑嵌入式主板性能对比
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
- IOS多态在项目中的应用
今天我们讲述一个知识点(大家可能遗漏的) 多态是面试程序设计(OOP)一个重要特征,但在iOS中,可能比较少的人会留意这个特征,实际上在开发中我们可能已经不经意的使用了多态.比如说: 有一个table ...
- Mysql 的 create as 和create like 区别
大家可能使用Navicat Premium时发现很方便,比如复制表或数据结构等,其实这种复制表数据或结构方法就是create table as 和create table like 这种方式实现细心的 ...
- Spring Boot Security 整合 JWT 实现 无状态的分布式API接口
简介 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案.JSON Web Token 入门教程 - 阮一峰,这篇文章可以帮你了解JWT的概念.本文重点讲解Spring Boo ...
- ideal中spring的xml文件没有提示的问题
ideal中spring的xml文件没有提示的问题 今天第一次用ideal来练习spring,发现和视频中老师不一样,我的没有提示.老师的视频里,他写了个<mvc:a 就会有一系列的提示,然 ...
- (七) Keras 绘制网络结构和cpu,gpu切换
视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 首先安装py ...