Open duyue6002 opened 5 years ago
function resolvePromise(promise2, x, resolve, reject) {
let then;
let thenCalledOrThrow = false;
if (promise2 === x) {
return reject(new TypeError('Chaining cycle detected for promise'))
}
if (x instanceof myPromise) {
if (x.status === 'pending') {
x.then(function(value) {
resolvePromise(promise2, value, resolve, reject)
}, reject)
} else {
x.then(resolve, reject)
}
return
}
if ((x !== null) && ((typeof x === 'object') || (typeof x === 'function'))) {
try {
then = x.then
if (typeof then === 'function') {
then.call(x, function rs(y) {
if (thenCalledOrThrow) return
thenCalledOrThrow = true
return resolvePromise(promise2, y, resolve, reject)
}, function rj(r) {
if (thenCalledOrThrow) return
thenCalledOrThrow = true
return reject(r)
})
} else {
resolve(x)
}
} catch (error) {
if (thenCalledOrThrow) return
thenCalledOrThrow = true
return reject(error)
}
} else {
resolve(x)
}
}
myPromise.prototype.then = function(onResolved, onRejected) {
let self = this;
let promise2;
onResolved = typeof onResolved === 'function' ? onResolved : function(v) {return v};
onRejected = typeof onRejected === 'function' ? onRejected : function(r) {throw r};
if (self.status === 'resolved') {
return promise2 = new Promise(function(resolve, reject) {
setTimeout(() => {
try {
let x = onResolved(self.data);
resolvePromise(promise2, x, resolve, reject)
} catch (error) {
reject(error);
}
});
})
}
if (self.status === 'rejected') {
return promise2 = new Promise(function(resolve, reject) {
setTimeout(() => {
try {
let x = onRejected(self.data);
resolvePromise(promise2, x, resolve, reject)
} catch (error) {
reject(error)
}
});
})
}
if (self.status === 'pending') {
return promise2 = new Promise(function(resolve, reject) {
self.onResolvedCallback.push(function(value) {
try {
let x = onResolved(value);
resolvePromise(promise2, x, resolve, reject)
} catch (error) {
reject(error)
}
})
self.onRejectedCallback.push(function(reason) {
try {
let x = onRejected(reason);
resolvePromise(promise2, x, resolve, reject)
} catch (error) {
reject(error)
}
})
})
}
}
构造函数主体
构造函数框架如下:
添加捕错机制
添加 resolve / reject 方法