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 ...
随机推荐
- 怎么对ORACLE里的CLOB字段进行模糊查询
select b.* from oss_service_log a left join oss_service_log_detail b on a.pk_log = b.pk_log where a. ...
- PostgreSQL体系架构与内存结构
PostgreSQL体系架构 PostgreSQL的内存结构
- jsoup获取标签下的文本(去除子标签的)
jsoup获取标签下的文本(去除子标签的) <pre name="code" class="java">Element content=doc.se ...
- SQL多个逗号分开的字段值 取对应的数据名称信息
字段值 函数实现: )) ) as begin set @strs=','+@strs+',' ) ) set @str2='' declare SyncOrderCursor cursor for ...
- Mysql查询的执行顺序
顺序: FROM JOIN ON WHERE GROUP BY (从此处开始可以使用select中指定的别名) AVG.SUM.MAX HAVING SELECT DISTINCT ORDER BY ...
- 【翻译】Flink Table Api & SQL — Hive Beta
本文翻译自官网:Hive Beta https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/hive/ Flink ...
- [LeetCode] 529. Minesweeper 扫雷
Let's play the minesweeper game (Wikipedia, online game)! You are given a 2D char matrix representin ...
- [LeetCode] 531. Lonely Pixel I 孤独的像素 I
Given a picture consisting of black and white pixels, find the number of black lonely pixels. The pi ...
- windows server 守护进程nssm
安装nssm 下载程序 https://nssm.cc/ci/nssm-2.24-101-g897c7ad.zip 安装nssm,以管理员运行cmd.exe,执行如下: C:\Users\prolds ...
- [资料]ObjectARX 2020参考指南翻译中文版
chm使用Google Chrome浏览器翻译,有些翻译不是很理想,因为2万5千多个html文件, 修正难度太大,所以只处理了一部分. 非常感谢 gzxl 辛苦肉眼修正一些翻译问题. 欢迎进入QQ群: ...