day202-简单实现Promise(4)

要点

  1. resolved,rejectedpending三种情况的相应处理

代码

/** promise */
MyPromise.prototype.then = function(onFulfilled, onRejected) {
var self = this

// 根据标准,如果then的参数不是function,则我们需要忽略它
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : function(v) { return v}
onRejected = typeof onRejected === 'function' ? onRejected : function(r) { return r }

if (self.status === 'resolved') {
// 这里promise的状态已经确定是resolved,所以调用onResolved
return new MyPromise(function(resolve, reject) {
try {
// ret是onFulfilled的返回值
var ret = onFulfilled(self.data)
if (ret instanceof MyPromise) {
// 如果ret是一个promise,则取其值作为新的promise的结果
ret.then(resolve, reject)
} else {
// 否则,以它的返回值作为新的promise的结果
resolve(ret)
}
} catch (e) {
// 如果出错,以捕获到的错误作为promise2的结果
reject(e)
}
})
}

// 这里的逻辑跟前面一样,不再赘述
if (self.status === 'rejected') {
return new MyPromise(function(resolve, reject) {
try {
var ret = onRejected(self.data)
if (ret instanceof MyPromise) {
ret.then(resolve, reject)
} else {
reject(ret)
}
} catch (e) {
reject(e)
}
})
}

if (self.status === 'pending') {
// 如果当前的Promise还处于pending状态,则不能确定调用
// onResolved还是onRejecte,只能等到Promise状态确定后,
// 才能确定如何处理
return new MyPromise(function(resolve, reject) {
self.onFulfilledCallback.push(function(value) {
try {
var ret = onFulfilled(self.data)
if (ret instanceof MyPromise) {
ret.then(resolve, reject)
} else {
resolve(ret)
}
} catch (e) {
reject(e)
}
})

self.onRejectedCallback.push(function(value) {
try {
var ret = onRejected(self.data)
if (ret instanceof MyPromise) {
ret.then(resolve, reject)
} else {
reject(ret)
}
} catch (e) {
reject(e)
}
})
})
}
}

// 顺便实现一下catch方法
MyPromise.prototype.catch = function(onRejected) {
return this.then(null, onRejected);
}
文章作者: lmislm
文章链接: http://lmislm.com/2019/08/03/2019-08-03/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LMISLMのBlog