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);
})