Promise实现
Promise实现:最难的部分感觉是不同实现的Promise之间的交互,代码看不懂,暂时不加那部分的代码
function Promise (executor){ var self = this self.status = 'pending' self.data = null self.onResolvedCallBack = [] self.onRejectedCallBack = [] function reslove(value){ if(self.status === 'pending'){ self.status = 'fulfilled' self.data = value self.onResolvedCallBack.forEach(cb => cb(value)) } } function reject(reason){ if(self.status === 'pending'){ self.status = 'rejected' self.data = reason self.onRejectedCallBack.forEach(cb => cb(reason)) } } try{ executor(reslove,reject) }catch(e){ reject(e) } } Promise.prototype.then = function(onResolved,onRejected){ let self = this let promise2 onResolved = typeof onResolved === 'function' ? onResolved : value => { return value } onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason } if(self.status === 'fulfilled'){ return promise2 = new Promise((reslove,reject) => { try{ var x = onResolved(self.data) if(x instanceof Promise){ x.then(reslove,reject) }else{ reslove(x) } }catch(e){ reject(e) } }) } if(self.status === 'rejected'){ return promise2 = new Promise((reslove,reject) => { try{ var x = onRejected(self.data) if(x instanceof Promise){ x.then(reslove,reject) }else{ reslove(x) } }catch(e){ reject(e) } }) } if(self.status === 'pending'){ return promise2 = new Promise((reslove,reject) => { self.onResolvedCallBack.push(function(value){ try{ var x = onResolved(value) if(x instanceof Promise){ x.then(reslove,reject) }else{ reslove(x) } }catch(e){ reject(e) } }) self.onRejectedCallBack.push(reason => { try{ var x = onRejected(reason) if(x instanceof Promise){ x.then(reslove,reject) }else{ reslove(x) } }catch(e){ reject(e) } }) }) } } Promise.prototype.catch = function(onRejected){ return this.then(null,onRejected) } /** * 不同之间的Promise之间交互目前实在是看不太懂,暂时不加上那部分代码 */ Promise.resolve = value => { return new Promise((resolve,reject) => {resolve(value)}) } Promise.reject = reason => { return new Promise((reslove,reject) => {reject(reason)}) } Promise.all = promises => { return new Promise((reslove,reject) => { let values = [] let count = 0 promises.forEach((promise,index,promises) => { promise.then(value => { values[index] = value count++ if(count === promises.length){ resolve(values) } },reject) }) }) } Promise.race = promises => { return new Promise((reslove,reject) => { promises.forEach(promise => { promise.then(reslove,reject) }) }) } Promise.allSettled = promises => { return new Promise((resolve) => { let values = [] let count = 0 promises.forEach((promise,index,promises) => { promise.then(value => { values[index] = value }).catch(error => { values[index] = error }).finally(() => { ++count if(count == promises.length){ resolve(values) } }) }) }) } Promise.any = promises => { return new Promise((resolve,reject) => { let count = 0 let arr = [] promises.forEach(promise => { promise.then(res => { resolve(res) }).catch(err => { ++count arr.push(err) if(count == promises.length){ reject(arr) } }) }) }) }
以自己现在的努力程度,还没有资格和别人拼天赋