JavaScript永远悬而未决的承诺是不是很糟糕?

时间:2016-07-09 21:07:03

标签: javascript promise ecmascript-6 es6-promise

假设我有一个名为myProm的承诺,并说我有成功和错误处理程序称为onSuccessonError

每当我的诺言需要超过10秒才能完成,我希望执行一个名为timeoutHandler的函数,但如果发生这种情况,则不应执行onSuccessonError。 (同样,如果onSuccessonError运行,我不希望我的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对象,因为它仍处于挂起状态(或沿着这些行的某些内容)。

2 个答案:

答案 0 :(得分:6)

应该没有副作用。如果任何状态下的非引用Promise都在保留资源,那将是一个浏览器错误。

请确保您不要对Promise对象进行任何引用,您就可以了。

请注意某些API(例如setTimeout)将保持对闭包的引用,直至达到超时值。这意味着如果你有一个很长的超时,比如10s,你应该在你不再需要它时立即清除它。否则,您的代码可以在10秒内调用数千个setTimeout,并且每个代码都会保留对闭包的引用,在您的情况下,它将引用Promise

答案 1 :(得分:4)

您可以使用Promise.race(),将timeoutHandler设置为在十秒内返回被拒绝的Promise的函数,否则应在满足{{1}时调用onSuccess } Promise



myProm




plnkr http://plnkr.co/edit/9UD5syOEOc1oQGdRTRRm?p=preview