说我有一个承诺叫myProm
,并说我有成功和错误处理程序onSuccess
and onError
.
每当我的 Promise 需要超过 10 秒才能完成时,我想要一个名为timeoutHandler
被处决,但如果发生这种情况,onSuccess
nor onError
应该被执行。 (同样,如果onSuccess
or onError
运行,我不想要我的timeoutHandler
被处决。)
我为此想出了以下片段。
new Promise((suc, err) => {
let outOfTime = false;
const timeoutId = window.setTimeout(() => {
outOfTime = true;
timeoutHandler();
}, 10000);
myProm.then(
(...args) => {
if (!outOfTime) {
window.clearTimeout(timeoutId);
suc(...args);
}
},
(...args) => {
if (!outOfTime) {
window.clearTimeout(timeoutId);
err(...args);
}
}
);
}).then(onSuccess, onError);
然而,如果超时,我新定义的承诺将永远悬而未决。这会产生任何负面影响吗?例如,运行时无法清理 Promise 对象,因为它仍然处于挂起状态(或类似的情况)。
应该没有副作用。如果未引用,这将是一个浏览器错误Promise
在任何状态下都保留资源。
只要确保您没有保留任何对Promise
对象,你会没事的。
请注意某些 API,例如setTimeout
将在超时值之前保留对闭包的引用。这意味着,如果您有很长的超时(例如 10 秒),则应在不再需要时立即清除它。否则你的代码可能会调用数千个setTimeout
在 10 秒内,每个人都会保留对闭包的引用,在您的情况下,它将引用Promise
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)