classPromise{constructor(ext){this.PEDDING='pedding'this.FULILLY='fulilly'this.REJECT='reject'this.state =this.PEDDINGthis.value =''this.reason =''this.fulArr =[]this.refArr =[]letresolve=(val)=>{this.state =this.FULILLYthis.value = val
this.fulArr.forEach(element=>element());}letreject=(val)=>{this.state =this.REJECTthis.reason = val
this.refArr.forEach(element=>element());}try{ext(resolve,reject)}catch(error){reject(error)}this.resolvePromise=(promise,x,resolve,reject)=>{if(promise === x){returnreject(newTypeError('循环promise错误'))}let called
if(typeof x ==='object'&& x!==null||typeof x ==='function'){try{let then = x.then
if(typeof then ==='function'){then.call(x,y=>{if(called)return
called =truethis.resolvePromise(promise,y,resolve,reject)},r=>{if(called)return
called =truereject(r)})}else{resolve(x)}}catch(e){if(called)return
called =truereject(e)}}else{resolve(x)}}}then(fulFunc,rejFunc){let isFulFunc =typeof fulFunc ==='function'let isRejFunc =typeof rejFunc ==='function'let promise2 =newPromise((resolve,reject)=>{if(this.state ===this.FULILLY){setTimeout(()=>{try{if(isFulFunc){let x =fulFunc(this.value)this.resolvePromise(promise2, x , resolve, reject)}else{resolve(this.value)}}catch(err){reject(err)}})}elseif(this.state ===this.REJECT){setTimeout(()=>{try{if(isRejFunc){let x =rejFunc(this.reason)this.resolvePromise(promise2, x , resolve, reject)}else{reject(this.reason)}}catch(err){reject(err)}})}elseif(this.state ===this.PEDDING){this.fulArr.push(()=>{setTimeout(()=>{try{if(isFulFunc){let x =fulFunc(this.value)this.resolvePromise(promise2, x , resolve, reject)}else{resolve(this.value)}}catch(err){reject(err)}})})this.refArr.push(()=>{setTimeout(()=>{try{if(isRejFunc){let x =rejFunc(this.reason)this.resolvePromise(promise2, x , resolve, reject)}else{reject(this.reason)}}catch(err){reject(err)}})})}})return promise2
}}
Promise.deferred=function(){var result ={};
result.promise =newPromise(function(resolve, reject){
result.resolve = resolve;
result.reject = reject;});return result;};var promisesAplusTests =require("promises-aplus-tests");promisesAplusTests(Promise,function(err){
console.log(err)// All done; output is in the console. Or check `err` for number of failures.});