약속을 해결하지 않으면 메모리 누수가 발생합니까? 성공적으로 완료되었습니다. 단순화 된 스 니펫 : var defer

나는 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라이프 사이클 을 관리하는 방법에 대한 조언이 있습니까?



답변

글쎄, 나는 당신이 그것에 대한 명시적인 참조를 유지하지 않는다고 가정합니다.

내가 생각할 수있는 가장 간단한 테스트는 실제로 많은 약속을 할당하고 해결하지 않는 것입니다.

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 페이지에 대해 15 메가 바이트 미만으로 “계속 유지” 합니다.

여기에 이미지 설명 입력

다른 쪽에서는 소스 코드를 보면$q

전역 지점에서 특정 약속에 대한 참조가없고 약속에서 콜백에 대한 참조 만 있음을 알 수 있습니다. 코드는 매우 읽기 쉽고 명확합니다. 그러나 콜백에서 프라 미스에 대한 참조가있는 경우 어떻게하는지 살펴 보겠습니다.

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);

여기에 이미지 설명 입력

따라서 초기 할당 후-그것도 처리 할 수있는 것 같습니다. 🙂

그의 마지막 예제를 몇 분 더 실행하면 GC의 흥미로운 패턴을 볼 수도 있습니다. 시간이 걸리는 것을 알 수 있지만 콜백을 정리할 수 있습니다.

여기에 이미지 설명 입력

간단히 말해서-적어도 최신 브라우저에서는 외부 참조가없는 한 해결되지 않은 약속에 대해 걱정할 필요가 없습니다.


답변