前言

大部分同学对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源码解析的更多相关文章

  1. Netty 源码解析(三): Netty 的 Future 和 Promise

    今天是猿灯塔“365篇原创计划”第三篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel 当前:Ne ...

  2. jQuery2.x源码解析(回调篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 通过艾伦的博客,我们能看出,jQuery的pro ...

  3. Koa2 源码解析(1)

    Koa2 源码解析 其实本来不想写这个系列文章的,因为Koa本身很精简,一共就4个文件,千十来行代码. 但是因为想写 egg[1] 的源码解析,而egg是基于Koa2的,所以就先写个Koa2的吧,用作 ...

  4. jQuery2.x源码解析(DOM操作篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) jQuery这个类库最为核心重要的功能就是DOM ...

  5. co源码解析

    一.co函数是什么 co 函数库是著名程序员 TJ Holowaychuk 于2013年6月发布的一个小工具,用于 Generator 函数的自动执行.短小精悍只有短短200余行,就可以免去手动编写G ...

  6. Netty 4源码解析:服务端启动

    Netty 4源码解析:服务端启动 1.基础知识 1.1 Netty 4示例 因为Netty 5还处于测试版,所以选择了目前比较稳定的Netty 4作为学习对象.而且5.0的变化也不像4.0这么大,好 ...

  7. Netty5客户端源码解析

    Netty5客户端源码解析 今天来分析下netty5的客户端源码,示例代码如下: import io.netty.bootstrap.Bootstrap; import io.netty.channe ...

  8. Netty5服务端源码解析

    Netty5源码解析 今天让我来总结下netty5的服务端代码. 服务端(ServerBootstrap) 示例代码如下: import io.netty.bootstrap.ServerBootst ...

  9. redux的源码解析

    一. redux出现的动机 1. Javascript 需要管理比任何时候都要多的state2. state 在什么时候,由于什么原因,如何变化已然不受控制.3. 来自前端开发领域的新需求4. 我们总 ...

随机推荐

  1. 【重学计算机】计组D3章:运算方法与运算器

    1. 定点数运算及溢出 定点数加减法:减法化加法,用补码直接相加,忽略进位 溢出:运算结果超出了某种数据类型的表示范围 溢出检测方法:统一思想概括为正正得负或负负得正则溢出,正负或负正不可能溢出 方法 ...

  2. [个人网站搭建]·Django增加评论功能(Python3)

    [个人网站搭建]·Django增加评论功能 个人主页--> https://xiaosongshine.github.io/ 个人网站搭建github地址:https://github.com/ ...

  3. winform注册功能

    注册按钮事件: private void btnRegister_Click(object sender, EventArgs e) { string username = txtUserName.T ...

  4. oracle学习笔记(四) DQL数据查询语言和TCL 事务控制语言

    DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...

  5. PHP基础笔记

    今天一个阳光明媚的大周天,小崔百无聊赖的翻看着各种老旧的经典电影,无奈谁让自己是没女朋友的单身狗呢.闲来无事就记录一下PHP的一些基础知识吧! 1.PHP是什么? PHP是一种创建动态交互性站点的服务 ...

  6. Windows 2019 docker 速记

    教程参考: http://www.runoob.com/docker/docker-tutorial.html 开发调试参考: https://www.cnblogs.com/xuebuwan/arc ...

  7. Django用户继承AbstractUser后密码为明文

    Django用户继承AbstractUser后密码为明文 其实本不应该有这个问题,却花了我很久的时间,因为还是初学阶段. 造成这个原因是因为在admin注册的生活没有指定Admin 在app的admi ...

  8. Fixed-Point Designer(设计、仿真和分析定点系统)

    Fixed-Point Designer™ 提供开发定点和单精度算法所需的数据类型和工具,以在嵌入式硬件上进行性能优化.Fixed-Point Designer 会分析您的设计并提供建议的数据类型和属 ...

  9. HTTP中GET和POST的区别主要是那些,面试中可以加分的该说那些?

    面试回答: GET请求在URL中传送的参数是有长度限制的,而POST没有. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息. GET参数通过URL传递,POST放在Re ...

  10. webstorm2018.1 汉化

    https://github.com/pingfangx/TranslatorX 这个百度云 选择webstorm 选择勾选的文件 选择你下载webstorm 的版本 我下载的是2018.1的 之后等 ...