我在这里介绍了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原理的更多相关文章

  1. es6的promise用法详解

    es6的promise用法详解 promise 原理 promise是es6的异步编程解决方案, 是es6封装好的对象: 一个promise有三种状态:Pending(进行中).Resolved(已完 ...

  2. ES6的promise对象研究

    ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...

  3. Promise原理 && 简单实现

    Promise原理 参考https://github.com/chunpu/promise/blob/master/promise.js 个人认为原博的实现有点问题 在next函数的实现上, 会导致无 ...

  4. promise原理

      简介 Promise 对象用于延迟(deferred) 计算和异步(asynchronous )计算.一个Promise对象代表着一个还未完成,但预期将来会完成的操作.Promise 对象是一个返 ...

  5. ES6的Promise

    推荐一下我觉得不错关于Promise的好文章,通俗易懂 说起ES6的Promise就要提及一下JQ的$.when()方法,两者基本相同 面试的时候经常会问Promise,如果同学们能在回答Promis ...

  6. Promise 原理

    异步:可同时好几件事,互不影响: 同步:按循序一件一件.... 异步好多缺点:.... promise就是解决异步计算的这些缺点的,主要用于: 1.异步计算: 2.可以将异步操作队列化  按期望的顺序 ...

  7. ES6语法 promise用法

    ES6语法 promise用法 function doSomething(){ return new Promise((resolve,reject)=>{ resolve('jjjj');// ...

  8. 浅谈ES6原生Promise

    浅谈ES6原生Promise 转载 作者:samchowgo 链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游 ...

  9. ES6之Promise用法详解

    一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...

随机推荐

  1. 一、JavaScript基础

    一.区分大小写 ECMAScript中的一切(变量.函数名和操作符)都区分大小写,(js用于行为交互.数据交互.逻辑交互) 二.标识符 指变量.函数.属性的名字,或者函数的参数 命名规则:1.第一个字 ...

  2. TCP/IP协议栈中的TimeStamp选项

    原文转自:http://www.cnblogs.com/lovemyspring/articles/4271716.html TCP应该是以太网协议族中被应用最为广泛的协议之一,这里就聊一聊TCP协议 ...

  3. springMvc将对象json返回时自动忽略掉对象中的特定属性的注解方式

    1.注解使用在 类名,接口头上 @JsonIgnoreProperties(value={"comid"}) //希望动态过滤掉的属性 例 @JsonIgnorePropertie ...

  4. Red Hat Enterprise Linux ISO 全镜像下载

    1.iso网盘下载地址:https://wanghualang.pipipan.com/dir/13133650-26232498-a8efb3/ 2.中国大陆开源镜像站汇总,企业贡献: 搜狐开源镜像 ...

  5. copyProperties 忽略null值字段

    在做项目时遇到需要copy两个对象之间的属性值,但是有源对象有null值,在使用BeanUtils来copy时null值会覆盖目标对象的同名字段属性值,然后采用以下方法找到null值字段,然后忽略: ...

  6. burpsuite证书生成和导入

    官网下载个社区版,基本还是够用的 配置代理的ip和port,选择根证书生成方式 访问配置的ip:port,下载证书 双击下载的证书,导入keychain 打开keychain,信任根证书 再次使用bu ...

  7. Kubernetes 使用 ingress 配置 https 集群(十五)

    目录 一.背景 1.1 需求 1.2 Ingress 1.3 环境介绍 二.安装部署 2.1.创建后端 Pod 应用 2.2 创建后端 Pod Service 2.3.创建 ingress 资源 2. ...

  8. (转)Java中的String为什么是不可变的? -- String源码分析

    背景:被问到很基础的知识点  string  自己答的很模糊 Java中的String为什么是不可变的? -- String源码分析 ps:最好去阅读原文 Java中的String为什么是不可变的 什 ...

  9. [转帖]中兴GoldenDB数据库开始了第一轮中信银行核心业务系统迁移落地

    中兴GoldenDB数据库开始了第一轮中信银行核心业务系统迁移落地 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...

  10. [转帖]比特币本质其实是UTXO

    比特币本质其实是UTXO https://www.jianshu.com/p/7071e68c5262 其实并没有什么比特币,我们在交易所里或者钱包里显示的比特币余额其实是UTXO.那到底什么是UTX ...