2013-10-03 103 views
-1

所以我有一個節點應用程序,當它啓動時產生一個對象。刪除全局變量nodejs

function my_object(){ 

} 

my_object.prototype.say_lol = function() { 
    setTimeout(function(){ 
     console.log('lol'); 
    }, 1000); 
}; 


var ping = new my_object(); 

ping.say_lol(); 

process.on('SIGINT', function() { 

    delete global.ping; // Please? 


    // pseudo code to go update something in the database or whatever 
    setTimeout(function(){ 
     process.exit(); 
    }, 4000); 

}); 

當它結束時,我需要刪除該對象,以防止它在超時掛起期間反覆發射。有沒有這樣做的優雅方式?

+0

請添加更多關於您嘗試解決什麼問題的信息。你嘗試過'刪除ping'嗎? 'process.exit()'應該停止代碼執行;我非常肯定,沒有進一步的待處理'setTimeout'回調被執行 – Plato

+0

我已經更新了示例,使其更容易理解,爲什麼你會想要這樣做。我試過'刪除ping',但沒有成功。 – lededje

+0

標題完全歪曲了問題。刪除對象不能解決問題,所以沒有可接受的答案會匹配標題。 – Annan

回答

3

您需要捕獲setTimeOut返回的id,然後清除它,如果您不想稍後觸發。

my_object.prototype.say_lol = function() { 
    return (setTimeout(function(){ 
     console.log('lol'); 
    }, 1000)); 
}; 

var ping = new my_object(); 
var timeOutId = ping.say_lol(); 

process.on('SIGINT', function() { 
    clearTimeout(timeOutId); 
    process.exit(); 
}); 

如果事件未被解僱,它將被取消。如果它已經被解僱,它就會失敗。

+0

我不想結束超時我想刪除整個對象。在我的項目中,這個函數裏面還有一堆其他東西正在滴答作響。我需要放棄整個事情。 – lededje

+2

你通常不會在JavaScript中「刪除」東西。你只需撤消你所做的任何事情,停止引用它們,然後它們就會消失。 'clearTimeout()'是停止計時器的正確方法。 – tadman

0

我不知道一種方法來阻止射擊回調。我的方法是跟蹤另一個變量中的ping的狀態,並使用if語句來包裝任何代碼塊引發不需要的回調。

function my_object(){ }; 
var stillHere = true; 

my_object.prototype.say_lol = function() { 
    setTimeout(function(){ 
    if(stillHere){ 
     console.log('lol'); 
    } 
    }, 2000); 
}; 

var ping = new my_object(); 
ping.say_lol(); 

process.on('SIGINT', function() { 
    delete global.ping; // Please? 
    stillHere = false; 
    setTimeout(function(){ 
    process.exit(); 
    }, 4000); 
}); 
+0

RE:我的刪除答案。你在哪裏是對的。它刪除變量,但監聽器保持不變。 – lededje

0

雖然我明白這不是一個真正的答案,但是這解決了我的問題。我在集羣中運行了節點進程,並殺掉了我想刪除的任何子節點。這在我的例子中起作用,因爲孩子們正在執行無盡的任務,當我需要他們停止時,這是我能夠中止他們的唯一合乎邏輯的方式。