自己的Promise
Posted amiezhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己的Promise相关的知识,希望对你有一定的参考价值。
废话不多说,直接上代码:
class myPromise constructor(fn) this.status = ‘pending‘; this.resolveCbs = []; this.rejectCbs = []; this.value = null; fn(this._resolve.bind(this), this._reject.bind(this)) _resolve(val) this.value = val; this.status = ‘resolved‘; this.resolveCbs.forEach(cb => cb(this.value); ) _reject(err) this.value = err; this.status = ‘rejected‘; this.rejectCbs.forEach(cb => cb(this.value); ) // 如果没有处理函数,则直接抛错 if (this.rejectCbs.length === 0) throw err then(resolveCb, rejectCb) if (this.status === ‘resolved‘) resolveCb(this.value); else if (this.status === ‘rejected‘) rejectCb(this.value); else return new myPromise((resolve, reject) => if (typeof resolveCb === ‘function‘) this.resolveCbs.push(res => this._handleCb(resolveCb, res, resolve, reject); ) if (typeof rejectCb === ‘function‘) this.rejectCbs.push(res => this._handleCb(rejectCb, res, resolve, reject); ) ) catch(rejectCb) return this.then(null, rejectCb) _handleCb(cb, res, resolve, reject) try const ret = cb(res) if (ret instanceof Promise || ret instanceof myPromise) ret.then(res => resolve(res)) else resolve(ret) catch (err) reject(err) new myPromise((resolve, reject) => setTimeout(() => resolve(456) , 1000); ).then(res => console.log(res) throw ‘hualala‘ ).catch(err => console.log(‘heng!!!‘) return new myPromise((resolve, reject) => setTimeout(() => reject(233) , 1000); ) ).then(res => console.log(res) )
这个简版的Promise已经可以实现到链式的地步了, 如果return是一个非Promise,则直接resolve,如果是Promise,则等then再resolve
以上是关于自己的Promise的主要内容,如果未能解决你的问题,请参考以下文章
假设把官方的promise.all去掉,实现自己的promise.all方法