基本原理

今天心血来潮,哈哈,就想写个promise对象,需要说的是,我没有参考谁的代码,也没有去看promise的源码,当然,我实现的是一个乞丐版的promise,只有then & catch 的功能,其中catch只能抓取一次。仅供大伙闲暇看看,打发下时间。代码注释简单说了下,如下:

import _ from 'lodash'var compose = _.flowRightclass Xpromise {constructor(f) {this._value = f.bind(undefined, this.resolve, this.reject) // 为传入的 函数 绑定resolve & reject 方法this.chain = undefined // 把then传入的方法 通过compose 处理成链式调用this.errFunc = [] // 把catch 传入的方法setTimeout( () => { // 如果new 一个新的对象,传入的函数不是异步的,则chain & errFunc 拿不到就执行了。所以使用定时器延时执行。this.errHandle(this._value)()}, 0)this.status = 'pending' // 设置Xpromise 状态 主要作用是 确保resolve & reject只能执行其中一个return this}resolve = (data) => {if(this.status == 'pending')this.status = 'resolved'this.status == 'resolved' && this.chain && this.chain(data)}reject = (data) => {if(this.status == 'pending')this.status = 'rejected'this.status = 'rejected' && this.errFunc[0](data)}then = (f) => {this.chain = this.chain? compose(this.errHandle(f), this.chain): this.errHandle(f)return this}errHandle = (f) => {// 为每个传入的函数包裹 错误检查 代码return function() {var args = Array.prototype.slice.call(arguments, 0)try{return f.apply(f,args)}catch(e){if(this.errFunc.length !== 0)this.errFunc[0](e)elsethrow new Error(e)return}}}catch = (f) => {this.errFunc.push(f)return this}
}

手动实现Promise相关推荐

  1. 手动实现Promise 1

    手动实现Promise JavaScript是单线程的语言,通过维护执行栈与任务队列而实现了异步操作,setTimeout与Ajax就是典型的异步操作,Promise就是异步操作的一个解决方案,用于表 ...

  2. 手动实现promise基础功能代码并测试自己写的promise库是否符合规范

    promise 解决的问题 回调嵌套/回调地狱 多重异步处理错误捕获不方便 多重异步同步处理的问题 异步并发问题 promise 定义 Promise是一个类 默认浏览器.高版本(ie8以上).nod ...

  3. 定时器和promise_分析 Promise 内部实现

    在介绍Promise之前,首先我们举一个栗子,看下面代码 function success (message) {console.log(message)}function fail (message ...

  4. 有了async/await,你可以丢掉promise链了

    异步函数可能会一直存在,但有些人认为async/await可能会被抛弃. 为什么? 一个常见的误解是async/await和promise是完全不同的东西. 但其实async/await是基于prom ...

  5. 什么是显式promise构造反模式,如何避免呢?

    本文翻译自:What is the explicit promise construction antipattern and how do I avoid it? I was writing cod ...

  6. 常见 Promise 面试问题

    前端面试过程中,基本都会问到 Promise,如果你足够幸运,面试官问的比较浅,仅仅问 Promise 的使用方式,那么恭喜你.事实上,大多数人并没有那么幸运.所以,我们要准备好九浅一深的知识. 常见 ...

  7. util.promisify 的那些事儿

    util.promisify是在node.js 8.x版本中新增的一个工具,用于将老式的Error first callback转换为Promise对象,让老项目改造变得更为轻松. 在官方推出这个工具 ...

  8. 2019 Web 前端热点笔试面试题总结(转载)

    提醒:我只是答案的搬运工,如果在浏览中发现有错误,欢迎评论中提出来,我好修改,谢谢! 简述异步和同步的区别: 同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求,等请求完,页面刷新,新内容出现 ...

  9. js中Generator函数详解

    文章目录 1. Generator的定义和执行 2. Generator中yield在赋值号左边的情况 3. Generator函数嵌套使用 4. 使用generator函数完成网络请求 1. Gen ...

最新文章

  1. 智源研究院发布“知识疫图-全球新冠疫情智能驾驶舱”,一键预测、跟踪和决策辅助...
  2. 使用NetFlow分析网络异常流量
  3. java统计文本中英文单词个数split_零基础入门NLP - 新闻文本分类Task2(天池入门赛)...
  4. python数组切片教程_手把手numpy教程【二】——数组与切片
  5. c++头文件_51单片机C语言编程知多少:几人不知头文件,你要的干货在这里了
  6. 自动驾驶路径轨迹规划(三阶曲线spline)
  7. 使用Python写入docx文件并控制字体颜色
  8. Python实现一条基于POS算法的区块链
  9. verilog异步复位jk触发器_同步复位和异步复位常见问题总结
  10. 微信小程序踩坑(1):wx.showModal模态对话框中content换行
  11. 在虚幻引擎5中构建你的首款游戏 - 03 - 模型和材质蓝图
  12. 加入在线服务--在线多人共享屏幕
  13. 杂谈:微信推出赞赏码功能,如何使用?
  14. Arthas——热替换
  15. “双花”问题及解决之道
  16. 网络类型之BMA与NBMA的区别
  17. Egret的eui的使用
  18. EChart配置--基准线(坐标轴指示器axisPointer)的配置
  19. 清理kdevtmpfsi、dbused挖矿木马程序
  20. win7为啥总扫描计算机,Win7系统U盘插入电脑后就会提示扫描并修复怎么办

热门文章

  1. 常考数据结构与算法:两数之和
  2. mac终端下修改MySQL的编码格式以解决中文乱码问题--找不到my-default.cnf及my.cnf
  3. WKWebView中经常用到的操作
  4. node-sass安装失败解决方法
  5. Cookie简单使用方法
  6. python windows下的file()
  7. JAVA实现HTTPserver端
  8. jQuery技术内幕:深入解析jQuery架构设计与实现原理
  9. Lync 2010迁移Lync 2013 PART6:迁移CMS
  10. html+js浏览器检测