前言

大部分同学对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. Spring之旅第六篇-事务管理

    一.什么是事务 什么是事务(Transaction)?事务是数据库中的概念,是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 有个非常经典的转账问题:A向B转款1000元,A转出成 ...

  2. SpringBoot是怎么在实例化时候将bean加载进入容器中

    之前写过的很多spring文章,都是基于应用方面的,这次的话,就带大家来一次对spring的源码追踪,看一看spring到底是怎么进行的初始化,如何创建的bean,相信很多刚刚接触spring的朋友, ...

  3. OpenCV各版本差异与演化,从1.x到4.0

    博客:blog.shinelee.me | 博客园 | CSDN 写在前面 最近因项目需要,得把OpenCV捡起来,登录OpenCV官网,竟然发现release了4.0.0-beata版本,所以借此机 ...

  4. Python:序列的增量赋值

    增量赋值运算符有 += 和 *=.+= 背后的特殊方法是 __iadd__,如果一个类没有实现 __iadd__ 方法,Python 会退一步调用 __add__ 方法.这两个方法的区别在于,__ia ...

  5. C#语法——消息,MVVM的核心技术。

    在C#中消息有两个指向,一个指向Message,一个指向INotify.这里主要讲INotify. INotify也有人称之为[通知],不管叫消息还是通知,都是一个意思,就是传递信息. 消息的定义 I ...

  6. 关于px,分辨率,ppi的辨析

    概述  在本篇文章的开始,我先为大家解释一下这三个名词的概念.  px全称为pixel--像素.pc及移动设备的屏幕就是通过往像素矩阵中填充颜色,从而在宏观上体现出图像.像素越小,图像越清晰.  分辨 ...

  7. WebGL或OpenGL关于模型视图投影变换的设置技巧

    目录 1. 具体实例 2. 解决方案 1) Cube.html 2) Cube.js 3) 运行结果 3. 详细讲解 1) 模型变换 2) 视图变换 3) 投影变换 4) 模型视图投影矩阵 4. 存在 ...

  8. 2.5 Cesium视域分析的实现

    Cesium 视域分析 祝愿周末没事,技术继续分享交流,群685834990

  9. Java的SSH框架整合

    写了好多篇的Android代码了,在写几篇关于Java的,博客园里肯定都是java的前辈啊,写的不好多给意见. SSH,什么是SSH呢,Struts+Spring+Hibernate,这三个就是整个的 ...

  10. Android远程桌面助手(B1185)for Android P开发者预览版

    Android P的开发者预览版已出,其中App compatibility changes部分特别强调“The platform restricts the use of some non-SDK ...