2016-12-01 3 views
-1

node.js의 JavaScript 아래에서 실행되는 동안 의심 스럽습니다.처리되지 않은 거부 참조 보유

var z = new Image(); 
function x() 
{ 
    var promise = new Promise(); 
    return promise; 
} 
var promise = x(); 
promise.then(function(){}); 
.......... 
promise.reject(z); 

x()가 반환 한 약속에 리 젝트 처리기가 추가되지 않았습니다. 그러나 어떤 시점에서 응답 값 z로 거부 값을 보내는 경우 z가 가비지 수집 될 것인지 아니면 처리되지 않은 거부로 인해 z가 참조되는지 여부가 유지됩니다. 그러나 catch/reject 처리기를 추가하면 z에 대해 가비지 수집이 발생합니다.

처리되지 않은 거부에 전달 된 Z에 대해 가비지 수집이 발생하지 않는 이유를 명확히 설명하십시오.

+0

'z'는 모듈의 최상위 레벨에서 인스턴스화되기 때문에 파일에 전역적인 것처럼 보입니다. 즉, 글로벌 장소에 여전히 참조가 있기 때문에 가비지 수집되지 않습니다. 가비지 수집에 대한 자세한 내용은 여기를 참조하십시오. (https://strongloop.com/strongblog/node-js-performance-garbage-collection/) – peteb

답변

-1

[네이티브 A +] 약속을 사용하는 방법이 아닙니다.

는 다음과 같이하십시오 :

function x() 
{ 
    return new Promise((resolve,reject) => { 
     if(success()) { 
      resolve(success_val); 
     } else { 
      reject(new Error("fail!")); 
     } 
    }); 
} 

let promise = x(); 
promise.then(function(){}); 

당신은 그것이 만들어지는 곳 이외의 약속을 거부 할 수 있습니다. 생성자 콜백 (해결, 거부)을 사용해야합니다.

+0

이 질문에 대한 대답이라고 생각하지 않습니다. 질문은 수집 된 가비지와 왜 ' z'는'거부 '가 발생할 때 가비지 콜렉션이 아니며 promise chain에'catch()'가 없으므로 process.on ('unhandledRejection, (err) => {}); – peteb

+0

@peteb 잘 작동하지 않는 한 질문에 대답 할 수 없습니다. 일반적으로 무언가가 값에 대한 참조를 보유하고 있으면 가비지 수집되지 않습니다. – mpen

+0

그럼 대답하지 않습니까? 또한 Promise가 생성 된 곳이 아닌, Promise 체인의 어느 곳에서나'Promise.reject()'를 사용하여 거절 할 수 있습니다. – peteb

관련 문제