JavaScript 永远悬而未决的承诺是坏事吗?

2023-12-24

说我有一个承诺叫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(使用前将#替换为@)

JavaScript 永远悬而未决的承诺是坏事吗? 的相关文章

随机推荐