簡體   English   中英

Node.js:使用domain.dispose()

[英]Node.js: using domain.dispose()

我正在node.js中編寫一個服務器,並希望在連接失敗並出現錯誤時繼續運行它。 所以,我正在嘗試使用新的domain模塊,但找不到使用domain.dispose()的正確方法。

首先, node -v :v0.8.3

我認為應該在錯誤上調用domain.dispose()來清理域對象設置的內容。 但結果不是我的預期,我無法找到任何關於正確用法的文檔或討論。

這是我提出的用於隔離問題的代碼:

var domain = require('domain');
var EventEmitter = require('events').EventEmitter;

var i = 0;
function cycle() {
    process.nextTick(cycle);

    var emitter = new EventEmitter();
    emitter.i = ++i;
    emitter.on('test', function() {
        throw new Error('asdasd ' + emitter.i);
    });

    var dm = domain.create();
    dm.on('error', function(er) {
        console.error('Error', er);
        //dm.dispose();
    });
    dm.add(emitter);

    emitter.emit('test');
}

cycle();

它創建一個EventEmitter ,它是一個單獨的域,將發射器添加到域並觸發發射器的錯誤。 然后它重復。

一切都很好,循環繼續,錯誤被一個接一個地記錄:

[...]
Error { [Error: asdasd 1068]
  domain_thrown: true,
  domain: { members: [ [Object] ], _events: { error: [Function] } } }
Error { [Error: asdasd 1069]
  domain_thrown: true,
  domain: { members: [ [Object] ], _events: { error: [Function] } } }
[...]

現在,我添加domain.dispose() ,我想它應該是:

dm.on('error', function(er) {
    console.error('Error', er);
    dm.dispose();
});

這樣,循環只重復兩次:

Error { [Error: asdasd 1]
  domain_thrown: true,
  domain: { members: [ [Object] ], _events: { error: [Function] } } }
Error { [Error: asdasd 2]
  domain_thrown: true,
  domain: { members: [ [Object] ], _events: { error: [Function] } } }

沒有更多的輸出,程序就會退出。

所以,要么我不理解domain.dispose()的目的和語義,要么它不做它應該做的事情。 我可能會深入研究資料來源,但與此同時,如果只是為了后代,澄清這個問題會很好。 如果你知道應該如何使用該函數來保持應用程序存活,請分享。 謝謝。

通過使用v0.8.11節點將使用dm.dispose()正確循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM