class MyPromise {
constructor(fn) {
this.promiseState = 'pendding';
this.resolveFn = null;
this.rejectFn = null;
this.resolveResult = null;
this.rejectReason = null;
fn(this.resolve.bind(this), this.reject.bind(this))
}
resolve = (result) => {
if (this.promiseState === 'pendding') {
this.promiseState = 'fulfilled'
this.resolveResult = result;
if (this.resolveFn) {
this.resolveFn(result)
}
}
}
reject(reason) {
if (this.promiseState === 'pendding') {
this.promiseState = 'rejected'
this.rejectReason = reason;
if (this.rejectFn) {
this.rejectFn(reason)
}
}
}
then(resolve, reject) {
function setThenPromise(result, onResolve) {
if (result instanceof MyPromise) {
result.then(res => {
onResolve(res)
}, reject => {
onResolve(reject)
})
} else {
onResolve(result)
}
}
let thenPromise = new MyPromise((onResolve, onReject) => {
if (typeof resolve === 'function') {
setTimeout(() => {
if (this.promiseState === 'pendding') {
resolve && (this.resolveFn = function (result) {
setThenPromise(resolve(result), onResolve)
});
reject && (this.rejectFn = function (reason) {
setThenPromise(reject(reason), onResolve)
})
} else if (this.promiseState === 'fulfilled') {
setThenPromise(resolve(this.resolveResult), onResolve)
} else if (this.promiseState === 'rejected') {
setThenPromise(reject(this.rejectReason), onResolve)
}
})
}
})
return thenPromise
}
}
const promise = new MyPromise((resolve, reject) => {
resolve('MyPromise返回值')
})
promise.then(res => {
console.log('链式1', res)
return new MyPromise((resolve, reject) => {
setTimeout(function () {
resolve('MyPromise链式1 返回结果')
}, 100)
})
}).then(res => {
console.log('链式2', res)
return res + '链式2 返回结果'
}).then(res => {
console.log('链式3', res)
return res + '链式3 返回结果'
}).then(res => {
console.log('链式4', res)
})
setTimeout(function () {
const promise = new Promise((resolve, reject) => {
resolve('Promise返回值')
})
promise.then(res => {
console.log('链式1', res)
return new Promise((resolve, reject) => {
setTimeout(function () {
resolve('Promise链式1 返回结果')
}, 100)
})
}).then(res => {
console.log('链式2', res)
return res + '链式2 返回结果'
}).then(res => {
console.log('链式3', res)
return res + '链式3 返回结果'
}).then(res => {
console.log('链式4', res)
})
}, 2000)