我正在使用node.js开发一个游戏服务器,我想在队列中存储匹配项,以便能够在一定的超时后销毁它们。这基本上是我的实现:
var matchs = [];
var createMatch = function () {
matchs.unshift(new Match());
matchs[0].start();
setTimeout(function () {
delete matchs[matchs.length - 1];
matchs.pop();
}, 5 * 1000);
};
function Match() {
// ...
this.foo = 0;
this.start = function () {
var self = this;
setInterval(function () {
console.log(self.foo++);
}, 1 * 1000);
};
}
这段代码应该做的是,当我呼叫createMatch()
时,每秒显示一个递增的数字,并在5秒后停止。但是,如果我运行此代码,它将继续显示数字,这使我认为我的Match对象没有被正确销毁。
请帮忙吗?
答案 0 :(得分:3)
您可以使用clearInterval
清除间隔。
var handle = setInterval(..);
clearInterval(handle);
简单地引用Match
对象不会导致间隔停止,因为它仍然在运行。此外,该时间间隔将通过Match
变量保留对self
的引用。
答案 1 :(得分:2)
delete
运算符删除属性但不销毁对象,也不销毁对象创建的任何内容(如间隔)。所以你的setTimeout
实际上可能是:
setTimeout(function () {
matchs.pop().destroy();
}, 5 * 1000);
pop
从数组中删除元素(不再引用并且可以清除),但需要destroy()
来明确告诉它需要清理的Match
对象。在Javascript中,当对象真正从内存中删除时,无法执行某些操作。没有这样的概念。
所以你的Match
对象负责跟踪事后需要清理的事情,如下例所示:
function Match() {
this.intervalId = undefined;
this.start = function () {
...
this.intervalId = setInterval(function () {
...
}, 1 * 1000);
};
this.destroy = function() {
if (intervalId) {
clearInterval(this.intervalId);
}
}
}
超时和间隔是资源,可以通过相应的功能销毁。在这种情况下clearInterval()
。