2016-12-01 77 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是否會被垃圾收集,或者由於未處理的拒絕而引用它,它仍然會被保留。但是,當我添加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(){}); 

你不能拒絕它的創建,其中外的承諾。您必須使用(resolve,reject)構造函數回調。

+0

我不認爲這回答了這個問題,問題是關於垃圾收集和爲什麼'當'reject'發生並且由'process.on('unhandledRejection,(err)=> {})處理時,z'不是垃圾收集;'因爲承諾鏈中沒有'catch()'。 – peteb

+0

@peteb嗯,我不能沒有一個工作的例子回答這個問題。通常情況下,如果某個東西持有對某個值的引用,它將不會被垃圾收集。 – mpen

+0

那就不要回答了?你也可以在承諾鏈中的任何地方使用'Promise.reject()'來引起拒絕,而不僅僅是創建Promise的地方。 – peteb

相關問題