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