Jes*_*ssy 9 javascript promise ecmascript-6 es6-promise
假设我有一个承诺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);
Run Code Online (Sandbox Code Playgroud)
但是,如果超时,我新定义的承诺将永远悬而未决.这会产生任何负面影响吗?例如,运行时无法清除Promise对象,因为它仍处于挂起状态(或沿着这些行的某些内容).
应该没有副作用.如果Promise
在任何状态下未引用都保留资源,那将是一个浏览器错误.
只要确保你没有保留Promise
对象的任何引用,你会没事的.
请注意某些API(例如setTimeout
将保持对闭包的引用达到超时值).这意味着如果你有一个很长的超时,比如10s,你应该在你不再需要它时立即清除它.否则你的代码可以setTimeout
在10秒内调用数千个,并且每个代码都会保留对闭包的引用,在你的情况下它将引用Promise
.
归档时间: |
|
查看次数: |
819 次 |
最近记录: |