手写简易版Promise

class dd {

static PENDING = "pending";

static FULFILLED = "fulfilled";

static REJECT = 'reject';

constructor(exec) {

this.status = dd.PENDING;

this.value = null;

exec(dd.resolve.bind(this),dd.reject.bind(this))

}

static resolve(value) {

if (this.status == dd.PENDING) {

this.status = dd.FULFILLED;

this.value = value;

}

}

static reject(value) {

if (this.status == dd.PENDING) {

this.status = dd.REJECT;

this.value = value;

}

}

then(onResolve, onReject) {

return new dd((resolve, reject)=> {

if (this.status == dd.FULFILLED) {

let result = onResolve(this.value);

if(result instanceof dd)

{

result.then(resolve,reject)

}else {

resolve(result)

}

}

if (this.status == dd.REJECT) {

let result = onReject(this.value);

if(result instanceof dd)

{

result.then(resolve,reject)

}else {

reject(result)

}

}

})

}

static all(dds) {

return new dd((resolve,reject)=>{

var list = [];

dds.forEach(d=> {

d.then((value)=>{

list.push(d)

if (list.length == dds.length) {

resolve(dds);

}

},(reason)=>{

reject(d);

})

})

})

}

static race(dds)

{

return new dd((resolve,reject)=>{

dds.forEach(d=> {

d.then((value)=>{

resolve(d);

},(reason)=>{

reject(d);

})

})

})

}

}

var d1=new dd((resolve,reject)=>{

resolve("成功");

})

var d2=new dd((resolve,reject)=>{

reject("失败");

})

dd.race([d1,d2]).then((value)=>{console.log(value)},(reason)=>{

console.log(reason);

})

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容