写源码可以了解一个函数的本质,通过对源码的理解可以让你对知识有更多的了解,欢迎大家留言交流学习。
function myPromise(fn){
if(typeof(fn) !== 'function'){
throw Error (`Promise resolver ${fn} is not a function`)
}
let _this=this;
this.status="pending";
this.data=null;
this.resolvedArr=[];
this.rejectedArr=[];
function resolved(data){
setTimeout(() => {
if(_this.status=='pending'){
_this.status = 'resolved';
_this.data = data;
_this.resolvedArr.forEach(function(fn){
return fn();
})
}
}, 0);
}
function rejected(err){
setTimeout(() => {
if (_this.status=='pending') {
_this.status = "rejected";
_this.data =err;
}
}, 0);
}
fn(resolved,rejected);
}
myPromise.prototype.then=function(onResolved,onRejected){
let _this = this;
if(_this.status=='resolved'){
return new myPromise(function(resolved,rejected){
let res= onResolved(_this.data)
if( res instanceof myPromise){ //判断res 是不是 myPromise的实例
res.then(resolved,rejected)
}else{
resolved(res);
}
})
}
if(_this.status == 'rejected'){
return new myPromise(function(resolved,rejected){
let res= onResolved(_this.data)
if( res instanceof myPromise){ //判断res 是不是 myPromise的实例
res.then(resolved,rejected)
}else{
resolved(res);
}
})
}
if(_this.status == 'pending'){
return new myPromise(function(resolved,rejected){
_this.resolvedArr.push((function (onResolved){
return function (){
var res = onResolved(_this.data)
if(res instanceof myPromise){
res.then(resolved,rejected)
}else{
resolved(res)
}
}
})(onResolved))
_this.rejectedArr.push((function (onRejected) {
return function () {
var res = onRejected(_this.data)
if(res instanceof myPromise) {
res.then(resolved, rejected)
} else {
resolved(res)
}
}
} )(onRejected))
})
}
}
var p2=new myPromise(function(resolved,rejected){
resolved('sasasa');
});
p2.then(function(data){
console.log(data)
},function(data){
console.log(data)
})
用class写promise源码
用class写promise源码
用class写promise源码
class myPromise{
constructor(fn){
if(typeof(fn) !== 'function'){
throw Error (`Promise resolver ${fn} is not a function`)
}
this.status="pending";
this.data=null;
this.resolvedArr=[];
this.rejectedArr=[];
let _this=this
function resolved(data){
setTimeout(() => {
if(_this.status=='pending'){
_this.status = 'resolved';
_this.data = data;
_this.resolvedArr.forEach((fn)=>fn())
}
}, 0);
}
function rejected(err){
setTimeout(() => {
if (_this.status=='pending') {
_this.status = "rejected";
_this.data =err;
}
}, 0);
}
fn(resolved,rejected)
}
then(onResolved,onRejected){
let _this = this;
if(_this.status=='resolved'){
return new myPromise((resolved,rejected)=>{
let res= onResolved(_this.data)
if( res instanceof myPromise){ //判断res 是不是 myPromise的实例
res.then(resolved,rejected)
}else{
resolved(res);
}
})
}
if(_this.status == 'rejected'){
return new myPromise((resolved,rejected)=>{
let res= onResolved(_this.data)
if( res instanceof myPromise){ //判断res 是不是 myPromise的实例
res.then(resolved,rejected)
}else{
resolved(res);
}
})
}
if(_this.status == 'pending'){
return new myPromise((resolved,rejected)=>{
_this.resolvedArr.push(((onResolved)=>
()=>{
let res = onResolved(_this.data)
if(res instanceof myPromise){
res.then(resolved,rejected)
}else{
resolved(res)
}
})(onResolved))
_this.rejectedArr.push(((onRejected)=>
()=> {
let res = onRejected(_this.data)
if(res instanceof myPromise) {
res.then(resolved, rejected)
} else {
resolved(res)
}
}
)(onRejected))
})
}
}
}