-1

所以我有一个节点应用程序,当它启动时会生成一个对象。

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);

});

当它结束时,我需要删除该对象以防止它在超时未决时一遍又一遍地触发大声笑。有什么优雅的方法可以做到这一点吗?

4

3 回答 3

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();
});

如果事件尚未触发,它将被取消。如果它已经被解雇,它会默默地失败。

于 2013-10-03T15:42:57.803 回答
0

虽然我知道这不是一个真正的答案,但这解决了我的问题。我在集群中运行节点进程并杀死了我想要删除的所有子进程。这在我的例子中起作用,因为孩子们正在执行无休止的任务,当我需要阻止他们时,这是我可以中止他们的唯一合乎逻辑的方式。

于 2013-10-04T23:51:09.540 回答
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);
});
于 2013-10-03T15:52:59.357 回答