js函数式
function MyPromise(excutor) {
const self = this
// 状态
self.status = 'pedding'
// 成功的结果
self.value = null
// 失败的结果
self.reason = null
self.onFulfilledCallbacks = []
self.onRejectedCallbacks = []
// 成功
function resolve(value) {
if (self.status === 'pedding') {
self.value = value
self.status = 'fulfilled'
self.onFulfilledCallbacks.forEach(item => item(value))
}
}
// 失败的
function reject(reason) {
if (self.status === 'pedding') {
self.reason = reason
self.status = 'fulfilled'
self.onRejectedCallbacks.forEach(item => item(reason))
}
}
try {
excutor(resolve, reject)
} catch(err) {
reject(err)
}
}
MyPromise.prototype.then = function(onFulfilled, onRejected) {
const self = this
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : function(data){resolve(data)}
onRejected = typeof onRejected === 'function' ? onRejected : function(err){throw err}
if (self.status === 'pedding') {
self.onFulfilledCallbacks.push(onFulfilled)
self.onRejectedCallbacks.push(onRejected)
}
}
const result = new MyPromise((resolve, reject) => {
console.log('这是自己写的promise')
setTimeout(() => {
console.log('这是promise实例中的setTimeout')
resolve('这是promise实例中的setTimeout resolve')
}, 1000)
})
result.then(res => {
console.log(res)
}, err => {
console.log(err)
})
js class类
class MyPromise {
status = 'pedding'
value = null
reason = null
onFulfilledCallBacks = []
onRejectedCallBacks = []
constructor(excutor) {
excutor(this.resolve, this.reject)
}
resolve = (value) => {
if (this.status === 'pedding') {
this.value = value
this.status = 'fulfilled'
this.onFulfilledCallBacks.forEach(item => item(value))
}
}
reject = (reason) => {
if (this.status === 'pedding') {
this.reason = reason
this.status = 'rejected'
this.onRejectedCallBacks.forEach(item => item(reason))
}
}
}
MyPromise.prototype.then = function(onFulfilled, onRejected) {
const self = this
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : function(data){resolve(data)}
onRejected = typeof onRejected === 'function' ? onRejected : function(err) {throw err}
if (self.status === 'pedding') {
self.onFulfilledCallBacks.push(onFulfilled)
self.onRejectedCallBacks.push(onRejected)
}
}
const result = new MyPromise((resolve, reject) => {
console.log('1')
setTimeout(() => {
console.log('2')
// resolve('3')
reject('错误的')
}, 1000)
console.log('4')
})
result.then((res) => {
console.log(res, '1')
}, err => {
console.log(err, '2')
})