当前位置: 首页 > news >正文

150行实现Promise 90%的功能

Promise的实现也算是一个老话题了,网上同类型的文章和示例代码不少,其中不乏许多优秀的实现。但因为Promise“魔幻”的API,以及背后包含的异步处理的独特思想,使得实现一个Promise仍旧是一个富有挑战和趣味性的问题。

这里笔者给出一个自己的实现。为了更好地解释实现的过程,我把Promise的实现分成了10个阶段,并按一个阶段一次提交的规则,完成了下面这个代码库

github.com/lqt0223/pro…

这个实现基本覆盖了Promise的以下功能:

  1. 基本功能:promise是一个对象,它接收一个函数作为参数。当promise被创建时,函数会被立即执行。

  2. 设定异步操作:可调用Promise.prototype.then来设定一些未来完成的操作。当promise对象变成resolved状态时,在then体中的回调函数会被调用,异步的值也将被获取。

  3. 链式调用:调用Promise.prototype.then将返回一个新的promise对象。在promise链中,当第一个promise中的步骤开始执行后,这个链便会自动地不断尝试resolve后续的promise直到结束。

  4. 状态控制:一个promise对象被创建后,初始状态为pending,后续会变为resolved或rejected中的任意一种状态。

  5. 错误处理:在promise中处理错误有几种方式:调用Promise.prototype.then时传入错误处理函数,或者调用Promise.prototype.catch

  6. 错误传递:当一个位于链中的promise状态变成rejected时,错误会向链尾部传递,直到找到一个错误处理函数或catch体。处于reject发生位置和错误处理函数之间的异步操作,将不会被执行。当错误被处理后,promise链才会恢复执行。

  7. then / catch体中promise的自动解析:当then / catch体中设定的回调函数返回一个promise时,这个promise将会被自动解析,其产生的值或错误也会被传递至后续的promise

  8. 异常捕获:一个promise对象不仅可以被显式地reject,也可以捕获其自身执行时抛出的异常或错误。

  9. 静态方法: Promise.resolve, Promise.reject, Promise.all & Promise.reject

  10. then的多次调用: 多次调用Promise.prototype.then可以将一些异步操作设定为并发执行

针对上述功能,代码库中也打上了10个对应的tag,方便切换查看。

最后,感谢您的star,分享和交流!

转载于:https://juejin.im/post/5a98fece6fb9a028c3683d6a

相关文章:

  • PlaNet图片识别机器,准确表现超过人类
  • 精选15个国外CSS框架
  • python基础—条件语句
  • 【391天】每日项目总结系列128(2018.03.03)
  • 有货移动Web端性能优化探索实践
  • 修复.NET的HttpClient
  • 51nod1683
  • KPN iTV的敏捷转型之旅
  • 设计模式之禅之单例模式!
  • 纠纷判决已出,法官要求Uber归还所有Waymo自动驾驶机密文件
  • 10个最新交互式Web设计实例欣赏
  • VSCode建立.net core项目
  • 事物(物质)的存在形式:结构与运动、维度空间:结构-空间,运动-时间...
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 商城系统针对开发者自有支付系统提供的解决方案
  • Apache Spark Streaming 使用实例
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Java教程_软件开发基础
  • java取消线程实例
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Netty源码解析1-Buffer
  • React-Native - 收藏集 - 掘金
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • vue中实现单选
  • web标准化(下)
  • Yii源码解读-服务定位器(Service Locator)
  • 阿里云Kubernetes容器服务上体验Knative
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 警报:线上事故之CountDownLatch的威力
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端攻城师
  • 区块链共识机制优缺点对比都是什么
  • 数据仓库的几种建模方法
  • 译有关态射的一切
  • linux 淘宝开源监控工具tsar
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • #每日一题合集#牛客JZ23-JZ33
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (十三)Maven插件解析运行机制
  • (转)Sql Server 保留几位小数的两种做法
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • @Service注解让spring找到你的Service bean
  • [ C++ ] STL_list 使用及其模拟实现
  • [ JavaScript ] JSON方法
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [BUAA软工]第一次博客作业---阅读《构建之法》
  • [C/C++]关于C++11中的std::move和std::forward