手写 Promise
myPromise 基本实现
Promise构造函数接收一个executor (执行) 函数,executor函数执行完同步或异步操作后,调用它的两个参数resolve和reject
Promise有三个状态: pending 等待(进行中)、resolved 成功 、rejected 失败
function myPromise (excutor) {
var self = this
self.status = 'pending'
self.value = null
self.reason = null
function resolve(value) {
if (self.status == 'pending') {
self.value = value
self.status = 'resolved'
}
}
function reject(reason) {
if (self.status == 'pending') {
self.reason = reason
self.status = 'rejected'
}
}
try {
executor(resolve, reject)
} catch(e) {
reject(e)
}
}
myPromise.prototype.then = (onFulfiled, onRejected) => {
let self = this
if (self.status == 'resolved') {
onFulfiled(self.value)
}
if (self.status == 'rejected') {
onFulfiled(self.reason)
}
}
Promise 异步状态处理 (场景 setTimeout)
function myPromise (excutor) {
var self = this
self.status = 'pending'
self.value = null
self.reason = null
self.onFulfilledCallbacks = []
self.onRejectedCallbacks = []
function resolve(value) {
if (self.status == 'pending') {
self.value = value
self.status = 'resolved'
self.onFulfilledCallbacks.forEach((item, i) => { return item.value })
}
}
function reject(reason) {
if (self.status == 'pending') {
self.reason = reason
self.status = 'rejected'
self.onRejectedCallbacks.forEach((item, i) => { return item.reason })
}
}
try {
executor(resolve, reject)
} catch(e) {
reject(e)
}
}
myPromise.prototype.then = (onFulfiled, onRejected) => {
let self = this
onFulfiled = onFulfiled typeof 'function' ? onFulfiled : (data) => { return data }
onRejected = onRejected typeof 'function' ? onRejected : (err) => { throw '王新鹏抛出的错误:' + err }
if (self.status == 'resolved') {
return myPromise((resolve, reject) => {
try {
let x = onFulfiled(self.value)
x instanceof Promise ? x.then(resolve, reject) : resolve(x)
} catch {
reject(err)
}
})
}
if (self.status == 'rejected') {
return myPromise((resolve, reject) => {
try {
let x = onRejected(self.reason)
x instanceof Promise ? x.then(resolve, reject) : resolve(x)
} catch {
reject(err)
}
})
}
if (self.status == 'pending') {
return myPromise ((resolve, reject) => {
self.onFulfilledCallbacks.push(() => {
let x = onFulfilled(self.value)
x instanceof Promise ? x.then(resolve, reject) : resolve(x)
})
self.onRejectedCallbacks.push(() => {
let x = onRejected(self.reason)
x instanceof Promise ? x.then(resolve, reject) : resolve(x)
})
})
}
}
myPromise.prototype.catch = (fn) => {
return this.then(null, fn)
}