假设我有一个名为myProm
的承诺,并说我有成功和错误处理程序称为onSuccess
和onError
。
每当我的诺言需要超过10秒才能完成,我希望执行一个名为timeoutHandler
的函数,但如果发生这种情况,则不应执行onSuccess
和onError
。 (同样,如果onSuccess
或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对象,因为它仍处于挂起状态(或沿着这些行的某些内容)。
答案 0 :(得分:6)
应该没有副作用。如果任何状态下的非引用Promise
都在保留资源,那将是一个浏览器错误。
请确保您不要对Promise
对象进行任何引用,您就可以了。
请注意某些API(例如setTimeout
)将保持对闭包的引用,直至达到超时值。这意味着如果你有一个很长的超时,比如10s,你应该在你不再需要它时立即清除它。否则,您的代码可以在10秒内调用数千个setTimeout
,并且每个代码都会保留对闭包的引用,在您的情况下,它将引用Promise
。
答案 1 :(得分:4)
您可以使用Promise.race()
,将timeoutHandler
设置为在十秒内返回被拒绝的Promise
的函数,否则应在满足{{1}时调用onSuccess
} Promise
myProm