gpt4 book ai didi

javascript - 从 Unresolved promise 会导致内存泄漏吗?

转载 作者:IT王子 更新时间:2023-10-29 02:46:09 24 4
gpt4 key购买 nike

我有一个 promise 。我创建它是为了在需要时取消 AJAX 请求。但是因为我不需要取消那个 AJAX,所以我从来没有解决过它并且 AJAX 成功完成。

一个简化的片段:

var defer = $q.defer();
$http({url: 'example.com/some/api', timeout: defer.promise}).success(function(data) {
// do something
});

// Never defer.resolve() because I don't need to cancel that ajax. What happens to this promise after request?

从未解决过这样的 promise 会导致内存泄漏吗?您对如何管理 Promise 生命周期有什么建议吗?

最佳答案

好吧,我假设您没有保留对它的显式引用,因为那样会强制它保持分配状态。

我能想到的最简单的测试实际上是分配了很多 promise 而不是解决它们:

var $q = angular.injector(["ng"]).get("$q");
setInterval(function () {
for (var i = 0; i < 100; i++) {
var $d = $q.defer();
$d.promise;
}
}, 10);

然后观察堆本身。正如我们在 Chrome 分析工具中看到的那样,这会累积分配 100 个 promise 所需的内存,然后在整个 JSFIddle page 不到 15 兆字节的情况下“留在那里”。

enter image description here

从另一方面来看,如果我们看一下 $q source code

我们可以看到,没有从全局点到任何特定 promise 的引用,而只有从 promise 到其回调的引用。代码非常易读和清晰。让我们看看如果你确实有一个从回调到 promise 的引用。

var $q = angular.injector(["ng"]).get("$q");
console.log($q);
setInterval(function () {
for (var i = 0; i < 10; i++) {
var $d = $q.defer();
(function ($d) { // loop closure thing
$d.promise.then(function () {
console.log($d);
});
})($d);
}
}, 10);

enter image description here

所以在初始分配之后 - 它似乎也能够处理 :)

如果让他的最后一个示例再运行几分钟,我们还可以看到一些有趣的 GC 模式。我们可以看到它需要一段时间 - 但它能够清除回调。

enter image description here

简而言之 - 至少在现代浏览器中 - 只要你没有对它们的外部引用,你就不必担心 Unresolved promise

关于javascript - 从 Unresolved promise 会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20068467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com