2017-11-20 11 views
1

이 같은 장기 실행 과정에서 약속 체인에 약속을 추가하는 경우 :체인에서 GC'd가 더 완료된 약속이 완료 되었습니까?

let q = Promise.resolve(); 
let i = setInterval(() => { 
    q = q.then(() => { 
     return new Promise((resolve) => { 
      setTimeout(() => { 
       console.log("one resolved"); 
       resolve(); 
      }, 1) 
     }); 
    }); 
}, 2); 

체인에 완성 된 약속이 쓰레기 수집받을 것인가, 아니면 메모리를 누출?

장기 실행 응용 프로그램에서 체인 var (q)를 q = (q + nextPromise)에 다시 할당하여 체인에 추가하는 것이 안전합니까? 약속 기반 큐를 만드는 더 좋은 방법이 있습니까? 그것은이 GC'd 될 것 같아이 예에서

enter image description here

하지만, 이것은 단지 이상 30 초?

+0

예제에는 긴 체인이 없습니다. 모든 콜백이 동일한'q' 약속에 추가됩니다 – Bergi

+0

긴 체인을 만들고 싶다면'q = q.then (...)'을 수행해야합니다. 그러면 질문이 더 이해가됩니다. – jfriend00

+0

@Bergi 덕분에 이것이 게시 할 의도였습니다. 업데이트 된 코드 – zino

답변

1

완료된 약속 가제비가 수집됩니까?

은 예, 그들은 아무것도에 의해 참조하지거야 - 어느 쪽도 뛰어난 비동기 작업합니다 (resolve 콜백을 통해)도 글로벌 q 변수입니다. 디버거 스크린 샷에서 수집 된 것을 볼 수 있습니다.

then에 의해 작성된 약속은 콜백이 연결된 약속을 참조하지 않습니다. 콜백 (약속이 약속에 저장되어 있고, 심지어 리졸버를 통해서 약하게 만 가능함)만이 새로운 약속의 해결 능력을 참조합니다. 일단 정산되면 아무 것도 참고로 남지 않습니다.

는 안전하게 재 할당 장기 실행 응용 프로그램을 통해 q + nextPromise에 체인 변수 q을하여 체인에 추가 할 수 있나요?

예, 이것은 완전히 좋은 패턴입니다. 새 체인 링크를 해결할 수있는 것보다 빠르게 대기열에 넣지 않도록하십시오.

1

약속은 다른 어떤 객체와 다르지 않습니다. 일단 더 이상 참조가 없으면 GC'd됩니다.

약속이 해결 될 때까지 해당 resolve 콜백이 참조입니다 (해당 참조가 손실되고 약속을 확인할 수 없으며 GC가 될 수 있음).

+0

이것은 실제로 질문에 대답하지 않습니다. 문제는 그것이 체인의 일부일 때 GCed가 될 수 있는지를 알고 싶어하고 현재의 약속은 오래되었지만 다른 것들은 긴 체인으로 연결되어 있습니다. 그래서 우리 모두가 알아야 할 것은 체인에있을 때입니다. 체인에있는 자손의 참조가 GC에 적합하도록 지워졌을 때입니다. 그것은 여기서 진짜 질문입니다. – jfriend00