简单的 Promies 封装

function Promiss(fn) {
this.state = 'pending' //当前状态
this.value = null // 成功执行时得到的数据
this.reason = null // 执行失败时的返回值
this.resolveCallbacks = [] // 存储回调函数的数组
this.rejectCallbacks = []
resolve = value => {
this.state = 'resolver'
this.value = value
this.resolveCallbacks.map(cb => cb(this.value))
}
reject = reason => {
this.state = 'rejected'
this.value = value
this.resolveCallbacks.map(cb => cb(this.reason))
}
try {
fn(resolve, reject)
} catch (error) {
reject(error)
}
}
Promiss.prototype.then = function (onFulfilled, onRejected) {
if (this.state === 'pending') {
this.resolveCallbacks.push(onFulfilled)
this.rejectCallbacks.push(onRejected)
}
}
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('ok')
}, 2000)
})
.then(res => {
console.log(res);
})

Promise 原理

  • promise 的出现是为了解决回调地狱的问题,关键在于利用了 js 异步操作最后执行的特性,将回调方法的传递单独操作,不必担心异步代码执行过早
  • promise 的时间线如下
  1. 执行构造参数里的同步代码,将异步操作暂时挂起
  2. 将 then 方法传入的回调函数放入到相应的回调队列里
  3. 开始执行异步操作,执行至 resolve / reject 方法
  4. 在 resolve / reject 方法中改变 promise 的状态,执行 then 方法在步骤2里传入的回调函数

最新文章

  1. 【代码笔记】iOS-获取字符串的宽度,高度
  2. NGUI之添加响应函数
  3. 25个让人无法抗拒的HTML5网站设计实例
  4. 1.2机器学习基础下--python深度机器学习
  5. 使用DatagramSocket与DatagramPacket传输数据
  6. C#基础之------进制转换
  7. 剖析Elasticsearch集群系列第一篇 Elasticsearch的存储模型和读写操作
  8. springboot~hazelcast缓存中间件
  9. HTTP 初步探究
  10. Django之在Python中调用Django环境
  11. linux(fedora) 第一课
  12. 【HDU1693】Eat the Trees(插头dp)
  13. SQL Server 合并复制如何把备份的发布端或订阅端BAK文件还原为数据库
  14. Map:HashMap和TreeMap
  15. HttpServletRequest和HttpServletResponse实例
  16. django+nginx+uwsgi 项目部署
  17. 【js与jquery】javascript中url编码与解码
  18. 如何使用Photoshop制作真实的尺子
  19. C#面向对象之三大特性: 封装
  20. 洛谷 - P1141 - 01迷宫 - dfs

热门文章

  1. JavaWeb项目在浏览器点击几次就阻塞了
  2. (私人收藏)商务工作学习万能简约大气PPT模板
  3. 阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP) 并发调试之调试工具ab(apache bench)
  4. HotSpot项目结构
  5. css自动省略号...,通过css实现单行、多行文本溢出显示省略号
  6. CSS技术让高度自适应减少很多不必要的检测
  7. 面试必杀技,讲一讲Spring中的循环依赖
  8. React学习路径快速进入AntDesignPro开发
  9. ASP.NET MVC Route详解
  10. day13 作业