手写promise
class Promoses {
constructor(executor) {
this.state = 'pending'
this.value = undefined
this.reson = undefined
this.onFulfilledList = []
this.onRejectedList = []
let resolve = (res) => {
if (this.state !== 'pending') return false
this.state = 'fulfilled'
this.value = res
this.onFulfilledList.forEach(fn => fn())
}
let reject = (fil) => {
if (this.state !== 'pending') return false
this.state = 'rejected'
this.reson = fil
this.onRejectedList.forEach(fn => fn())
}
try {
executor(resolve, reject)
} catch (error) {
reject(error)
}
}
then(onFulfilled, onRejected) {
let promise2 = new Promoses((resolve, reject) => {
if (this.state === 'pending') {
this.onFulfilledList.push(() => {
setTimeout(() => {
let x = onFulfilled(this.value);
resolvePromise(x, resolve, reject, promise2);
});
})
this.onRejectedList.push(() => {
setTimeout(() => {
let x = onRejected(this.reson);
resolvePromise(x, resolve, reject, promise2);
});
})
}
if (this.state === 'fulfilled') {
setTimeout(() => {
let x = onFulfilled(this.value);
resolvePromise(x, resolve, reject, promise2);
});
}
if (this.state === 'rejected') {
setTimeout(() => {
let x = onRejected(this.reson);
resolvePromise(x, resolve, reject, promise2);
});
}
})
function resolvePromise(x, resolve, reject, promise2) {
if (x === promise2) {
console.error("出错");
return reject("出错")
}
if (x instanceof Promoses) {
x.then(resolve, reject)
} else {
resolve(x)
}
}
return promise2
}
resolve(val) {
return new Promoses((resolve, reject) => {
resolve(val)
})
}
reject(val) {
return new Promoses((resolve, reject) => {
reject(val)
})
}
race(promises) {
return new Promoses((resolve, reject) => {
console.log(promises);
promises.forEach(el => {
console.log(el);
el.then(resolve, reject)
console.log(el);
})
})
}
all(promises) {
let arr = []
let i = 0
return new Promoses((resolve, reject) => {
promises.forEach((el, index) => {
el.then(res => {
processaData(index, res,resolve)
}, reject)
})
})
function processaData(index, data,resolve) {
arr[index] = data
i++
if(i === promises.length){
resolve(arr)
}
}
}
}