class MyPromise { constructor ( executor ) { this . state = "pending" ; this . value = undefined ; this . reason = undefined ; this . onResolvedCallbacks = [ ] ; this . onRejectedCallbacks = [ ] ; const resolve = ( value ) => { if ( this . state === "pending" ) { this . state = "fulfilled" ; this . value = value; this . onResolvedCallbacks. forEach ( ( fn ) => fn ( ) ) ; } } ; const reject = ( reason ) => { if ( this . state === "pending" ) { this . state = "rejected" ; this . reason = reason; this . onRejectedCallbacks. forEach ( ( fn ) => fn ( ) ) ; } } ; try { executor ( resolve, reject) ; } catch ( err) { reject ( err) ; } } then ( onFulfilled, onRejected ) { onFulfilled = typeof onFulfilled === "function" ? onFulfilled : ( value ) => value; onRejected = typeof onRejected === "function" ? onRejected : ( reason ) => { throw reason; } ; const promise2 = new MyPromise ( ( resolve, reject ) => { if ( this . state === "fulfilled" ) { setTimeout ( ( ) => { try { const x = onFulfilled ( this . value) ; this . resolvePromise ( promise2, x, resolve, reject) ; } catch ( err) { reject ( err) ; } } , 0 ) ; } if ( this . state === "rejected" ) { setTimeout ( ( ) => { try { const x = onRejected ( this . reason) ; this . resolvePromise ( promise2, x, resolve, reject) ; } catch ( err) { reject ( err) ; } } , 0 ) ; } if ( this . state === "pending" ) { this . onResolvedCallbacks. push ( ( ) => { setTimeout ( ( ) => { try { const x = onFulfilled ( this . value) ; this . resolvePromise ( promise2, x, resolve, reject) ; } catch ( err) { reject ( err) ; } } , 0 ) ; } ) ; this . onRejectedCallbacks. push ( ( ) => { setTimeout ( ( ) => { try { const x = onRejected ( this . reason) ; this . resolvePromise ( promise2, x, resolve, reject) ; } catch ( err) { reject ( err) ; } } , 0 ) ; } ) ; } } ) ; return promise2; } resolvePromise ( promise2, x, resolve, reject ) { if ( promise2 === x) { return reject ( new TypeError ( "Chaining cycle detected for promise" ) ) ; } let called = false ; if ( x instanceof MyPromise ) { x. then ( ( value ) => { if ( called) return ; called = true ; this . resolvePromise ( promise2, value, resolve, reject) ; } , ( reason ) => { if ( called) return ; called = true ; reject ( reason) ; } ) ; } else { resolve ( x) ; } } static resolve ( value ) { return new MyPromise ( ( resolve, reject ) => { resolve ( value) ; } ) ; } static reject ( reason ) { return new MyPromise ( ( resolve, reject ) => { reject ( reason) ; } ) ; } static all ( promises ) { return new MyPromise ( ( resolve, reject ) => { const result = [ ] ; let count = 0 ; const processResult = ( index, value ) => { result[ index] = value; count++ ; if ( count === promises. length) { resolve ( result) ; } } ; promises. forEach ( ( promise, index ) => { if ( promise instanceof MyPromise ) { promise. then ( ( value ) => processResult ( index, value) , ( reason ) => reject ( reason) ) ; } else { processResult ( index, promise) ; } } ) ; } ) ; } static race ( promises ) { return new MyPromise ( ( resolve, reject ) => { promises. forEach ( ( promise ) => { if ( promise instanceof MyPromise ) { promise. then ( resolve, reject) ; } else { resolve ( promise) ; } } ) ; } ) ; }
}
调用举例
const promise = new MyPromise ( ( resolve, reject ) => { setTimeout ( ( ) => { resolve ( '成功' ) ; } , 1000 ) ;
} ) ;
promise. then ( value => { console. log ( '成功的结果:' , value) ; } , reason => { console. log ( '失败的原因:' , reason) ; }
) ;