我在这里介绍了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. SSM项目实战 之 权限管理系统

    目录 SSM权限管理系统 项目搭建 1.创建Maven-webapp工程 2.SSM框架集成 3.添加代码生成器 主页搭建 EasyUI主页 员工列表 1.在tree当中指定跳转的地址--暂时用tre ...

  2. Selenium自动化对非输入框的日历或日期控件的处理

    4.这个时候我们可以移除readonly的属性,问题就轻轻松松解决了,代码如下: String js = "document.getElementById('createTime').rem ...

  3. c++ 字符串时间格式转换为时间 判断有效期

    转载:https://www.cnblogs.com/maphc/p/3462952.html #include <iostream> #include <time.h> us ...

  4. 微信小程序开发——微信小程序下拉刷新真机无法弹回

    开发工具中下拉之后页面回弹有一定的延迟,这个时间也有点久.真机测试,下拉后连回弹都没有,这个问题要解决,就得在下拉函数里加上停止下拉刷新的API,如下: /** * 下拉刷新 */ onPullDow ...

  5. codeMirror配置

    介绍 CodeMirror是一款在线的支持语法高亮的代码编辑器.官网:http://codemirror.net/ 下载后,解压开到的文件夹中,lib下是放的是核心库和核心css,模式下放的是各种支持 ...

  6. bladex下载前端代码后,运行服务时报错【'vue-cli-service' 不是内部或外部命令,也不是可运行的程序或批处理文件。】的解决方法

    问题:E:\BladeXDB\Saber>yarn run serveyarn run v1.13.0$ vue-cli-service serve'vue-cli-service' 不是内部或 ...

  7. mysql之各版本rpm包安装

    发现每次想用mysql的rpm包直接安装的时候,都会出现找不到对应的rpm包的情况,故记录一下查找过程 进入官网->downloads->community->mysql commu ...

  8. [LeetCode] 682. Baseball Game 棒球游戏

    You're now a baseball game point recorder. Given a list of strings, each string can be one of the 4 ...

  9. QualityCenter(QC)—测试管理工具

    简介 Quality Center是一个基于Web的测试管理工具,可以组织和管理应用程序测试流程的所有阶段,包括制定测试需求.计划测试.执行测试和跟踪缺陷.此外,通过Quality Center还可以 ...

  10. OpenJudge 4120 硬币

    总时间限制: 1000ms 内存限制: 262144kB 描述 宇航员Bob有一天来到火星上,他有收集硬币的习惯.于是他将火星上所有面值的硬币都收集起来了,一共有n种,每种只有一个:面值分别为a1,a ...