Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从不解决的承诺是否会导致内存泄漏?_Javascript_Angularjs_Memory Leaks_Promise_Angular Promise - Fatal编程技术网

Javascript 从不解决的承诺是否会导致内存泄漏?

Javascript 从不解决的承诺是否会导致内存泄漏?,javascript,angularjs,memory-leaks,promise,angular-promise,Javascript,Angularjs,Memory Leaks,Promise,Angular 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

我有一个
承诺
。我创建它是为了在需要时取消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?

从未解决过这样的承诺会导致内存泄漏吗?关于如何管理
承诺
生命周期,您有什么建议吗?

好吧,我假设您没有明确引用它,因为这会迫使它保持分配状态

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

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

因此,在初始分配之后,它似乎也能够处理这一问题:)

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


简言之,至少在现代浏览器中,只要没有外部引用,就不必担心未解决的承诺

这是否意味着如果承诺需要太长时间才能解决(但最终会解决),它有被GC'd?@w.brian调用的风险,除非您将其分配到某个位置,例如分配给变量:
var b=$http.get(…)
,或者向其添加回调。这也提到了它。如果某个东西解决了它(就像你说的-太长时间无法解决仍然意味着解决)-它必须有一个对它的引用。所以,是的,这将不是GC'dGotcha,这就是我所想的。因此,问题是“从未解决的承诺是否会导致内存泄漏?”对于向承诺传递回调的常见用例,答案是肯定的。您的回答中的这一行似乎与此相矛盾:“如果我们让他的最后一个示例再运行几分钟,我们还可以看到一些有趣的GC模式。我们可以看到这需要一段时间,但它能够清理回调。”抱歉,如果我太迂腐和吹毛求疵,我只是想确定我明白这一点。这对我来说似乎没有意义。如果我创建了100.000个承诺,那么console.log()就会有一行。我想让那10万条线记录下来,如果它们突然通过某种魔法解决了。或者你是说浏览器会知道这永远不会解决,因为我和实际的浏览器都没有对它的任何引用(没有任何影响)-那么这怎么可能是真的?(嗯,我可以看出这可能是真的)这些评论中有些是真实的,有些是误导性的,所以让我澄清一下:附带处理程序的承诺可能符合垃圾收集的条件。如果以下任何一项为真,承诺将保持有效(不符合GC条件):(1)有对承诺对象的引用,(2)有对承诺“延迟”状态的引用(用于解决/拒绝承诺的对象/函数)。除此之外,该承诺有资格获得GC。(如果没有人有承诺,也没有人可以改变它的状态,那么它的目的是什么?)一个“从未解决”的承诺仍然可以被“拒绝”。您要查找的单词是“未实现”。$http是一个有趣的示例,因为如果客户端无法到达服务器,不管传递给“timeout”参数的承诺是什么,http请求最终都会超时(或产生错误响应)。
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);