2016-12-01 11 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のガベージコレクションが発生しています。

未処理の拒否に渡されたときに、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

私はこれが質問に答えたとは思わない、質問は収集されたガベージについてのもので、 '拒否 'が発生したときにガベージコレクションではなく、promise chainに' catch() 'が存在しないため、' process.on(' unhandledRejection、(err)=> {}); – peteb

+0

@peteb実例がなければ質問に答えることはできません。通常、値への参照を保持しているものがガベージコレクションされません。 – mpen

+0

それでは答えませんか? Promiseが作成される場所だけでなく、Promiseチェーン内のどこでも 'Promise.reject()'を使って拒否を引き起こすこともできます。 – peteb

関連する問題