)
) });
)
}, )
});
)
)
}, )
});
)
}, )
});
p.then(function (x) {
console.log(x)
}) //输出 1 链式调用1 链式调用2

// 4.v4.0 then函数中的onFullfilled和onRejected方法的返回值问题
function resolvePromise(promise, x, resolve, reject) {
if (promise === x) { throw new TypeError("type error") }
let isUsed;
if (x !== null && (typeof x === "object" || typeof x === "function")) {
try {
let then = x.then;
if (typeof then === "function") {
//是一个promise的情况
then.call(x, function (y) {
if (isUsed) return;
isUsed = true;
resolvePromise(promise, y, resolve, reject);
}, function (e) {
if (isUsed) return;
isUsed = true;
reject(e);
})
} else {
//仅仅是一个函数或者是对象
resolve(x)
}
} catch (e) {
if (isUsed) return;
isUsed = true;
reject(e);
}
} else {
//返回的基本类型,直接resolve
resolve(x)
}
}

myPromise.prototype.then = function (onFullfilled, onRejected) {
let self = this;
let promise2;

switch (self.status) {
case "pending":
promise2 = new myPromise(function (resolve, reject) {
self.onFullfilledArray.push(function () {
setTimeout(function () {
try {
let temple = onFullfilled(self.value);
resolvePromise(temple)
} catch (e) {
reject(e) //error catch     
}
})
});
self.onRejectedArray.push(function () {
setTimeout(function () {
try {

let temple = onRejected(self.reason); resolvePromise(temple)
} catch (e) {
reject(e)// error catch     
}
})
});
})
case "resolved":
promise2 = new myPromise(function (resolve, reject) {
setTimeout(function () {
try {
let temple = onFullfilled(self.value);
//将上次一then里面的方法传递进下一个Promise状态  
resolvePromise(temple);
} catch (e) {
reject(e);//error catch
}
})
})
break;
case "rejected":
promise2 = new myPromise(function (resolve, reject) {
setTimeout(function () {
try {
let temple = onRejected(self.reason);
//将then里面的方法传递到下一个Promise的状态里
resolvePromise(temple);
} catch (e) {
reject(e);
}
})
})
break;
default:
}
return promise2;
}

Promise源码深入理解的更多相关文章

  1. 这一次,彻底理解Promise源码思想

    关于Promise的源码实现,网上有太多答案,我也看过很多资料,但都不是很明白.直到有一天我学完函数式编程之函子的概念,才对Promise源码有了更深刻的认识.今天,就让我们来重新认识一下Promis ...

  2. 从源码上理解Netty并发工具-Promise

    前提 最近一直在看Netty相关的内容,也在编写一个轻量级的RPC框架来练手,途中发现了Netty的源码有很多亮点,某些实现甚至可以用苛刻来形容.另外,Netty提供的工具类也是相当优秀,可以开箱即用 ...

  3. storm源码之理解Storm中Worker、Executor、Task关系 + 并发度详解

    本文导读: 1 Worker.Executor.task详解 2 配置拓扑的并发度 3 拓扑示例 4 动态配置拓扑并发度 Worker.Executor.Task详解: Storm在集群上运行一个To ...

  4. React-setState源码的理解

    首先举一个最简单的例子: this.state={ a:1 } this.setState({ a:2 }) console.log(this.state.a)//1 可以说setState()操作是 ...

  5. 史上最完整promise源码手写实现

    史上最完整的promise源码实现,哈哈,之所以用这个标题,是因为开始用的标题<手写promise源码>不被收录 promise自我介绍 promise : "君子一诺千金,承诺 ...

  6. 从源码角度理解Java设计模式——装饰者模式

    一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...

  7. Promise源码实现与测试

    const PENDING = 'pending', FULFILLED = 'fulfilled', REJECTED = 'rejected' class MyPromise { construc ...

  8. 我对 impress.js 源码的理解

    源码看了两天,删掉了一些优化,和对 ipad 的支持,仅研究了其核心功能的实现,作以下记录. HTML 结构如下: <!doctype html> <html lang=" ...

  9. 从源码角度理解android动画Interpolator类的使用

    做过android动画的人对Interpolator应该不会陌生,这个类主要是用来控制android动画的执行速率,一般情况下,如果我们不设置,动画都不是匀速执行的,系统默认是先加速后减速这样一种动画 ...

随机推荐

  1. 【XSY2921】yja 拉格朗日乘法

    题目描述 在平面上找 \(n\) 个点,要求这 \(n\) 个点离原点的距离分别是 \(r_1,r_2,\ldots,r_n\),最大化这 \(n\) 个点构成的土包的面积.这些点的顺序任意. \(n ...

  2. jenkins在windows及linux环境下安装

    下载 下载地址: https://jenkins.io/download/ 下载windows和linux通用的war包 jenkins在windows下安装 前提:已经安装jdk.tomcat 将w ...

  3. linux下串口函数

    tcgetattr(), tcsetattr(), tcdrain(),tcflush(), tcflow(), tcsendbreak(),cfmakeraw(), cfgetispeed(),cf ...

  4. 小米平板2 win10 MIUI互刷教程

    在这篇文章中,我们会为大家提供Windows 10版小米平板2刷入MIUI和MIUI版小米平板2刷入Windows 10的两组教程. 不过从Win 10刷MIUI需要用原生安卓系统过渡来统一bios版 ...

  5. css at @ 规则

    css相信我们都不陌生,但是我们真的对它非常了解吗? css主要分为两种规则组成: 一种被称为 at-rule,也就是 at 规则 另一种是 qualified rule,也就是普通规则 今天让我们来 ...

  6. 集成Tomcat环境到Eclipse中

    集成Tomcat环境到Eclipse中 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装Eclipse环境 1>.安装JDK环境 官方地址:https://www.or ...

  7. VMware 虚拟机运行卡慢的解决办法

    虚拟机的运行速度有一部分原因决定于你的物理机的配置,如果你的物理机配置不高,建议不要运行虚拟机,那样反而会更卡! 切记!!!在操作之前,先给虚拟机拍摄一个快照,然后所有操作都在虚拟机关机的情况下执行! ...

  8. Linux 下软件的安装方法

    1:rpm 安装 ,rpm安装会有依赖问题,例如安装A,提示需要安装B 安装B需要安装C 格式: rpm -ivh [包名].rpm 2:yum 安装  特点:简单.易用.高校  缺点:不能定制 解决 ...

  9. CRMEB客户管理+电商管理系统帮助文档,送给有需要的人

    本项目还在不断开发完善中,如有建议或问题请言

  10. C#常用的单元测试框架

    C#常用的单元测试框架有XUnit .NUnit .MSTest 做过单元测试的同学大概都知道以上几种测试框架,这几种框架除了标注测试类和方法的特性用的不一样之外,XUnit 和 NUnit 是非常相 ...