问题描述
这是我自定义的promise实现,请忍受我的粗略编码。问题是有关以下检查的问题,以确保承诺没有循环引用。 Promises / A +表示会导致无限循环,但是当我运行测试时,它将立即停止。
if (bridgepromise === x) {
return reject(new TypeError('Circular reference/Chaining cycle detected for promise #<Promise>'));
}
所以我的考试是
let p = new customizedPromise((resolve,reject) => {
resolve(1)
})
let testPromise = p.then(value => { return testPromise })
testPromise.then(data => console.log(data))
让我思考通过说无限循环来实现promise / A +是什么意思,这是否会导致resolvePromise函数反复运行?还是意味着它永远不会解决或拒绝? 还是我兑现的承诺仍然存在错误?还是我的考试还不够?非常困惑。
当我在resolvePromise函数中使用console.log时,它那时没有到达回调,也没有达到下面的resolvePromise(bridgePromise,y,resolve,拒绝)。
const PENDING = "pending";
const FULFILLED = "fulfilled";
const REJECTED = "rejected";
function customizedPromise(cb) {
let self = this
self.value = null;
self.error = null;
self.status = PENDING;
self.onFulfilledCallBack = [];
self.onRejectedCallBack = [];
function resolve(value) {
// be careful about setTimeout's this
setTimeout(() => {
if (self.status === PENDING){
//actually here setting status is for later use
self.status = FULFILLED;
self.value = value;
self.onFulfilledCallBack.forEach(cb => cb(value))}
})
}
function reject(error) {
setTimeout(() => {
//actually here setting status is for later use
if (self.status === PENDING){
self.status = REJECTED;
self.error = error;
self.onRejectedCallBack.forEach(cb => cb(error))}
})
}
cb(resolve,reject)
}
// be careful about arrow function's this if you define then function as an arrow function
// it will point to the window
customizedPromise.prototype.then = function (onFulfilled,onRejected) {
let self = this;
let bridgePromise;
onFulfilled = typeof onFulfilled === "function" ? onFulfilled : value => value;
onRejected = typeof onRejected === "function" ? onRejected : error => { throw error };
if (self.status === FULFILLED) {
return bridgePromise = new customizedPromise((resolve,reject) => {
setTimeout(() => {
try {
let x = onFulfilled(self.value);
resolvePromise(bridgePromise,x,resolve,reject);
} catch (e) {
reject(e);
}
});
})
}
if (self.status === REJECTED) {
return bridgePromise = new customizedPromise((resolve,reject) => {
setTimeout(() => {
try {
let x = onRejected(self.error);
resolvePromise(bridgePromise,reject);
} catch (e) {
reject(e);
}
});
});
}
if (self.status === PENDING) {
return bridgePromise = new customizedPromise((resolve,reject) => {
self.onFulfilledCallBack.push((value) => {
try {
let x = onFulfilled(value);
resolvePromise(bridgePromise,reject);
} catch (e) {
reject(e);
}
});
self.onRejectedCallBack.push((error) => {
try {
let x = onRejected(error);
resolvePromise(bridgePromise,reject);
} catch (e) {
reject(e);
}
});
});
}
}
function resolvePromise(bridgePromise,reject) {
let called = false;
/* this if condition is not here when I run test */
**if (bridgePromise === x) {
return reject(new TypeError('Circular reference/Chaining cycle detected for promise #<Promise>'));
}**
if (x != null && ((typeof x === 'object') || (typeof x === 'function'))) {
try {
let then = x.then;
if (typeof then === 'function') {
then.call(x,y => {
console.log("it is not reaching here,hence no reference cycle")
if (called) return;
called = true;
resolvePromise(bridgePromise,y,reject);
},error => {
if (called) return;
called = true;
reject(error);
})
} else {
resolve(x);
}
} catch (e) {
if (called) return;
called = true;
reject(e);
}
}
else {
resolve(x);
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)