所以我有一个节点应用程序,当它启动时会创建一个对象。
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);
});
当它结束时,我需要删除该对象以防止它在超时挂起时反复触发lol。这有什么优雅的方式吗?
答案 0 :(得分: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();
});
如果事件未被触发,它将被取消。如果它已被解雇,它就会失败。
答案 1 :(得分: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);
});
答案 2 :(得分:0)
虽然我明白这不是一个真正的答案,但这解决了我的问题。我在集群中运行节点进程并杀死了我想要删除的所有子节点。这在我的实例中起作用,因为孩子们正在执行无休止的任务,当我需要它们被停止时,这是我可以放弃它们的唯一合乎逻辑的方式。