2013-10-03 194 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

虽然我明白这不是一个真正的答案,但是这解决了我的问题。我在集群中运行了节点进程,并杀掉了我想删除的任何子节点。这在我的例子中起作用,因为孩子们正在执行无尽的任务,当我需要他们停止时,这是我能够中止他们的唯一合乎逻辑的方式。