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

Jes*_*ssy 9 javascript promise ecmascript-6 es6-promise

假设我有一个承诺myProm,并说我有成功和错误处理程序调用onSuccessonError.

每当我的诺言需要超过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对象,因为它仍处于挂起状态(或沿着这些行的某些内容).

fer*_*olo 6

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

只要确保你没有保留Promise对象的任何引用,你会没事的.

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