欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

手动实现Promise

发布时间:2025/5/22 编程问答 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 手动实现Promise 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

基本原理

今天心血来潮,哈哈,就想写个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的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。