JSFiddle - React, Tailwind, and code Playground
by ruirui
JavaScript
class Promise{
constructor(executor){
this.status = 'pending';
this.value = '';
this.reason = '';
this.resolveCallbacks = [];
this.rejectCallbacks = [];
let resolve = (value) => {
if(this.status === 'pending') {
this.value = value;
this.status = 'fulfilled';
this.resolveCallbacks.forEach(fn=>fn())
}
}
let reject = (reason)=> {
if(this.status === 'pending') {
this.reason = reason;
this.status = 'rejected'
this.rejectCallbacks.forEach(fn=>fn())
}
}
try{
executor(resolve,reject);
}catch(e){ // 内部执行器抛出异常,调用reject处理
reject(e);
}
}
then(onfulfilled, onrejected) {
if(this.status === 'fulfilled') {
onfulfilled(this.value);
} else if(this.status === 'rejected') {
onrejected(this.reason);
} else if(this.status === 'pending') {
this.resolveCallbacks.push(()=>onfulfilled(this.value));
this.rejectCallbacks.push(()=>onrejected(this.reason));
}
}
}
let promise = new Promise(function(resolve,reject){
setTimeout(()=>{ // 异步
resolve(123)
}, 2000)
});
promise.then(function(value){
console.log('success',value);
},function(reason){
console.log('fail',reason);
})
promise.then(function(value){
console.log('success',value);
},function(reason){
console.log('fail',reason);
});