let promise = new MPromise((resolve, reject) => {
setTimeout(() => {
resolve('success')
}, 2000)
})
promise.then((data) => {
console.log(data);
return '999'
}).then((data) => {
console.log(123);
console.log(data);
})
class MPromise {
constructor(fn) {
this.status = 'PENDING'
this.value = ''
this.reason = ''
this.onFulfilledCallbacks = []
this.onRejectedCallbacks = []
let that = this
function resolve(value) {
if(that.status === 'PENDING') {
that.status = 'FULFILLED'
that.value = value
that.onFulfilledCallbacks.forEach(callback => {
callback(that.value)
})
}
}
function reject(reason) {
if(that.status === 'PENDING') {
that.status = 'REJECTED'
that.reason = reason
that.onRejectedCallbacks.forEach(callback => {
callback(that.reason)
})
}
}
try {
fn(resolve, reject)
} catch(err) {
reject(err)
}
}
then(onFulfilled, onRejected) {
let realOnFulfilled = onFulfilled
let realOnRejected = onRejected
if(typeof realOnFulfilled !== 'function') {
realOnFulfilled = (value) => {
return value
}
}
if(typeof realOnRejected !== 'function') {
realOnRejected = (reason) => {
return reason
}
}
let that = this
if(this.status === 'PENDING') {
this.onFulfilledCallbacks.push(realOnFulfilled)
this.onRejectedCallbacks.push(realOnRejected)
}
if(this.status === 'FULFILLED') {
return new MPromise(function(resolve, reject) {
try {
realOnFulfilled(that.value)
} catch(err) {
reject(err)
}
})
}
if(this.status === 'REJECTED') {
return new MPromise(function(resolve, reject) {
try {
realOnRejected(that.reason)
} catch(err) {
reject(err)
}
})
}
}
resolve(parameter) {
if(parameter instanceof MPromise) {
return parameter
}
return new MPromise((resolve) => {
resolve(parameter)
})
}
all(promiseList) {
let resPromise = new MPromise((resolve, reject) => {
let count = 0
let result = []
let length = promiseList.length
if(length === 0) {
return resolve(result)
}
promiseList.forEach((promise, index) => {
MPromise.resolve(promise).then((value) => {
count++
result[index] = value
if(count === length) {
return resolve(result)
}
}, (reason) => {
reject(reason)
})
})
})
return resPromise
}
}
https://segmentfault.com/a/1190000023157856
网友评论