class Promise {
constructor(ext){
this.PEDDING = 'pedding'
this.FULILLY = 'fulilly'
this.REJECT = 'reject'
this.state = this.PEDDING
this.value = ''
this.reason = ''
this.fulArr = []
this.refArr = []
let resolve = (val) => {
this.state = this.FULILLY
this.value = val
this.fulArr.forEach(element => element());
}
let reject = (val) => {
this.state = this.REJECT
this.reason = val
this.refArr.forEach(element => element());
}
try{
ext(resolve,reject)
}catch(error){
reject(error)
}
this.resolvePromise = (promise,x,resolve,reject) => {
if(promise === x){
return reject(new TypeError('循环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 = true
this.resolvePromise(promise,y,resolve,reject)
},r=>{
if(called) return
called = true
reject(r)
})
}
else{
resolve(x)
}
}
catch(e){
if(called) return
called = true
reject(e)
}
}
else{
resolve(x)
}
}
}
then(fulFunc,rejFunc){
let isFulFunc = typeof fulFunc === 'function'
let isRejFunc = typeof rejFunc === 'function'
let promise2 = new Promise((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)
}
})
}
else if(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)
}
})
}
else if (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 = new Promise(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.
});
手写promise 并通过测试
最新推荐文章于 2024-07-19 15:13:24 发布