ES6之promise原理
我在这里介绍了promise的原理: https://juejin.im/post/5cc54877f265da03b8585902
我在这里 仅仅张贴 我自己实现的简易promise——DiPromise(自己起的名字,嘿嘿嘿~~)
PS: 这个可以在控制台执行
let count = 0
class DiPromise {
constructor(executor) {
// 自己维护的状态
this.state = 'PENDING'
// FULFILLED or REJECTED 后的结果
this.value = ''
// 存储success, reject的回调
this.handlers = []
// 绑定this
this.handle = this.handle.bind(this)
this.onResolve = this.onResolve.bind(this)
this.onReject = this.onReject.bind(this)
this.then = this.then.bind(this)
this.done = this.done.bind(this)
// 这个只是调试用
this.name = count + 1
count += 1
// 在new的时候,立即执行executor,并给executor传入两个函数作为其参数
executor(this.onResolve, this.onReject)
} // 处理回调
handle(handl) {
if (this.state === 'PENDING') {
console.log('handl, PENDING ' + this.name)
this.handlers.push(handl)
} else {
if (this.state === 'FULFILLED') {
console.log(' FULFILLED ' + this.name)
handl.onFulfilled(this.value)
} else { // REJECT
console.log('reject')
handl.onReject(this.value)
}
}
}
// onResolve 1.改变状态, 2.并设置数据, 3.调用handlers里的回调
onResolve(result) {
console.log('in on resolve')
// 改变状态
this.state = 'FULFILLED'
// 存入数据
this.value = result
this.handlers.forEach(handle => handle.onFulfilled(result));
this.handlers = null;
}
// onReject 1.改变状态, 2.并设置数据, 3.调用handlers里的回调
onReject(error) {
this.state = 'REJECT'
this.value = error
this.handlers.forEach(handle => handle.onFulfilled(result));
this.handlers = null;
} // 要实现用.then链式调用,then返回了新的promise
then(onFulfilled, onReject) {
return new DiPromise((resolve, reject) => {
this.done(() => {
try {
return resolve(onFulfilled(this.value))
} catch (err) {
return reject(err)
}
}, () => {
try {
return resolve(onReject(this.value))
} catch (err) {
return reject(err)
}
})
})
} // 做的事情:只是将回调传给this.handle
done(onFulfilled, onReject) {
setTimeout(() => {
this.handle({
onFulfilled: onFulfilled,
onReject: onReject
})
}, 0)
}
}
const p = new DiPromise(function excutor(resolve, reject) {
setTimeout(() => {
console.log('setTimeout')
resolve('setTimeout')
}, 1000)
})
p.then((res) => {
console.log('then: ', res, this.name)
return 'ffffffff'
}).then((res) => {
console.log('then: ', res, this.name)
return '00000000$$$$$$'
})
控制台执行结果:

ES6之promise原理的更多相关文章
- es6的promise用法详解
es6的promise用法详解 promise 原理 promise是es6的异步编程解决方案, 是es6封装好的对象: 一个promise有三种状态:Pending(进行中).Resolved(已完 ...
- ES6的promise对象研究
ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...
- Promise原理 && 简单实现
Promise原理 参考https://github.com/chunpu/promise/blob/master/promise.js 个人认为原博的实现有点问题 在next函数的实现上, 会导致无 ...
- promise原理
简介 Promise 对象用于延迟(deferred) 计算和异步(asynchronous )计算.一个Promise对象代表着一个还未完成,但预期将来会完成的操作.Promise 对象是一个返 ...
- ES6的Promise
推荐一下我觉得不错关于Promise的好文章,通俗易懂 说起ES6的Promise就要提及一下JQ的$.when()方法,两者基本相同 面试的时候经常会问Promise,如果同学们能在回答Promis ...
- Promise 原理
异步:可同时好几件事,互不影响: 同步:按循序一件一件.... 异步好多缺点:.... promise就是解决异步计算的这些缺点的,主要用于: 1.异步计算: 2.可以将异步操作队列化 按期望的顺序 ...
- ES6语法 promise用法
ES6语法 promise用法 function doSomething(){ return new Promise((resolve,reject)=>{ resolve('jjjj');// ...
- 浅谈ES6原生Promise
浅谈ES6原生Promise 转载 作者:samchowgo 链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游 ...
- ES6之Promise用法详解
一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...
随机推荐
- 一、JavaScript基础
一.区分大小写 ECMAScript中的一切(变量.函数名和操作符)都区分大小写,(js用于行为交互.数据交互.逻辑交互) 二.标识符 指变量.函数.属性的名字,或者函数的参数 命名规则:1.第一个字 ...
- TCP/IP协议栈中的TimeStamp选项
原文转自:http://www.cnblogs.com/lovemyspring/articles/4271716.html TCP应该是以太网协议族中被应用最为广泛的协议之一,这里就聊一聊TCP协议 ...
- springMvc将对象json返回时自动忽略掉对象中的特定属性的注解方式
1.注解使用在 类名,接口头上 @JsonIgnoreProperties(value={"comid"}) //希望动态过滤掉的属性 例 @JsonIgnorePropertie ...
- Red Hat Enterprise Linux ISO 全镜像下载
1.iso网盘下载地址:https://wanghualang.pipipan.com/dir/13133650-26232498-a8efb3/ 2.中国大陆开源镜像站汇总,企业贡献: 搜狐开源镜像 ...
- copyProperties 忽略null值字段
在做项目时遇到需要copy两个对象之间的属性值,但是有源对象有null值,在使用BeanUtils来copy时null值会覆盖目标对象的同名字段属性值,然后采用以下方法找到null值字段,然后忽略: ...
- burpsuite证书生成和导入
官网下载个社区版,基本还是够用的 配置代理的ip和port,选择根证书生成方式 访问配置的ip:port,下载证书 双击下载的证书,导入keychain 打开keychain,信任根证书 再次使用bu ...
- Kubernetes 使用 ingress 配置 https 集群(十五)
目录 一.背景 1.1 需求 1.2 Ingress 1.3 环境介绍 二.安装部署 2.1.创建后端 Pod 应用 2.2 创建后端 Pod Service 2.3.创建 ingress 资源 2. ...
- (转)Java中的String为什么是不可变的? -- String源码分析
背景:被问到很基础的知识点 string 自己答的很模糊 Java中的String为什么是不可变的? -- String源码分析 ps:最好去阅读原文 Java中的String为什么是不可变的 什 ...
- [转帖]中兴GoldenDB数据库开始了第一轮中信银行核心业务系统迁移落地
中兴GoldenDB数据库开始了第一轮中信银行核心业务系统迁移落地 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...
- [转帖]比特币本质其实是UTXO
比特币本质其实是UTXO https://www.jianshu.com/p/7071e68c5262 其实并没有什么比特币,我们在交易所里或者钱包里显示的比特币余额其实是UTXO.那到底什么是UTX ...