Class 版
class mPromise { constructor ( executor ) { this . PromiseState = "pending" ; this . PromiseResult = null ; this . callbacks = [ ] ; const _this = this ; function resolve ( data ) { if ( _this. PromiseState !== "pending" ) return ; _this. PromiseState = "fulfilled" ; _this. PromiseResult = data; setTimeout ( ( ) => { _this. callbacks. forEach ( ( item ) => { item. onResolved ( data) ; } ) ; } ) ; } function reject ( data ) { if ( _this. PromiseState !== "pending" ) return ; _this. PromiseState = "rejected" ; _this. PromiseResult = data; setTimeout ( ( ) => { _this. callbacks. forEach ( ( item ) => { item. onRejected ( data) ; } ) ; } ) ; } try { executor ( resolve, reject) ; } catch ( e) { reject ( e) ; } } then ( onResolved, onRejected ) { const _this = this ; if ( typeof onRejected !== "function" ) { onRejected = ( err ) => { throw err; } ; } if ( typeof onResolved !== "function" ) { onResolved = ( val ) => val; } return new mPromise ( ( resolve, reject ) => { function callback ( onResult ) { try { const result = onResult ( _this. PromiseResult) ; if ( result instanceof mPromise ) { result. then ( ( val ) => { resolve ( val) ; } , ( err ) => { reject ( err) ; } ) ; } else { resolve ( result) ; } } catch ( e) { reject ( e) ; } } if ( this . PromiseState === "fulfilled" ) { setTimeout ( ( ) => { callback ( onResolved) ; } ) ; } if ( this . PromiseState === "rejected" ) { setTimeout ( ( ) => { callback ( onRejected) ; } ) ; } if ( this . PromiseState === "pending" ) { this . callbacks. push ( { onResolved : ( ) => { callback ( onResolved) ; } , onRejected : ( ) => { callback ( onRejected) ; } , } ) ; } } ) ; } catch ( onRejected) { return this . then ( undefined , onRejected) ; } static resolve ( value ) { return new mPromise ( ( resolve, reject ) => { if ( value instanceof mPromise ) { value. then ( ( val ) => { resolve ( val) ; } , ( err ) => { reject ( err) ; } ) ; } else { resolve ( value) ; } } ) ; } static reject ( err ) { return new mPromise ( ( resolve, reject ) => { reject ( err) ; } ) ; } static all ( promises ) { return new mPromise ( ( resolve, reject ) => { let count = 0 ; const arr = [ ] ; promises. forEach ( ( promise, i ) => { promise. then ( ( val ) => { arr[ i] = val; count++ ; if ( count === promises. length) { resolve ( arr) ; } } , ( err ) => { reject ( err) ; } ) ; } ) ; } ) ; } static race ( promises ) { return new mPromise ( ( resolve, reject ) => { promises. forEach ( ( promise ) => { promise. then ( ( val ) => { resolve ( val) ; } , ( err ) => { reject ( err) ; } ) ; } ) ; } ) ; }
}
function 版
function mPromise ( executor ) { this . PromiseState = "pending" ; this . PromiseResult = null ; this . callbacks = [ ] ; const _this = this ; function resolve ( data ) { if ( _this. PromiseState !== "pending" ) return ; _this. PromiseState = "fulfilled" ; _this. PromiseResult = data; setTimeout ( ( ) => { _this. callbacks. forEach ( ( item ) => { item. onResolved ( data) ; } ) ; } ) ; } function reject ( data ) { if ( _this. PromiseState !== "pending" ) return ; _this. PromiseState = "rejected" ; _this. PromiseResult = data; setTimeout ( ( ) => { _this. callbacks. forEach ( ( item ) => { item. onRejected ( data) ; } ) ; } ) ; } try { executor ( resolve, reject) ; } catch ( e) { reject ( e) ; }
} mPromise. prototype. then = function ( onResolved, onRejected ) { const _this = this ; if ( typeof onRejected !== "function" ) { onRejected = ( err ) => { throw err; } ; } if ( typeof onResolved !== "function" ) { onResolved = ( val ) => val; } return new mPromise ( ( resolve, reject ) => { function callback ( onResult ) { try { const result = onResult ( _this. PromiseResult) ; if ( result instanceof mPromise ) { result. then ( ( val ) => { resolve ( val) ; } , ( err ) => { reject ( err) ; } ) ; } else { resolve ( result) ; } } catch ( e) { reject ( e) ; } } if ( this . PromiseState === "fulfilled" ) { setTimeout ( ( ) => { callback ( onResolved) ; } ) ; } if ( this . PromiseState === "rejected" ) { setTimeout ( ( ) => { callback ( onRejected) ; } ) ; } if ( this . PromiseState === "pending" ) { this . callbacks. push ( { onResolved : ( ) => { callback ( onResolved) ; } , onRejected : ( ) => { callback ( onRejected) ; } , } ) ; } } ) ;
} ; mPromise. prototype. catch = function ( onRejected ) { return this . then ( undefined , onRejected) ;
} ;
mPromise. resolve = function ( value ) { return new mPromise ( ( resolve, reject ) => { if ( value instanceof mPromise ) { value. then ( ( val ) => { resolve ( val) ; } , ( err ) => { reject ( err) ; } ) ; } else { resolve ( value) ; } } ) ;
} ; mPromise. reject = function ( err ) { return new mPromise ( ( resolve, reject ) => { reject ( err) ; } ) ;
} ; mPromise. all = function ( promises ) { return new mPromise ( ( resolve, reject ) => { let count = 0 ; const arr = [ ] ; promises. forEach ( ( promise, i ) => { promise. then ( ( val ) => { arr[ i] = val; count++ ; if ( count === promises. length) { resolve ( arr) ; } } , ( err ) => { reject ( err) ; } ) ; } ) ; } ) ;
} ; mPromise. race = function ( promises ) { return new mPromise ( ( resolve, reject ) => { promises. forEach ( ( promise ) => { promise. then ( ( val ) => { resolve ( val) ; } , ( err ) => { reject ( err) ; } ) ; } ) ; } ) ;
} ;