我有一个名为Player
:
var Player = function(_id) {
var time = new Date().getTime();
this.act = function() {
if (new Date().getTime()-time>=5000)
this.destroy();
}
}
当我创建这个播放器对象时,我想destroy
在 5 秒后创建这个播放器。
现在我可以看到两种方法来解决这个问题:
如果我决定使用 act 方法(使用
setInterval
),它可能看起来像:Players = {}; for(var i=0;i<5;i++) Players[i] = new Player(i); setInterval( function() { for(var i=0;i<5;i++) Players[i].act(); }, 1 );
如果我决定
setTimeout
改用,例如:var Player = function() { setTimeout( function() { this.destroy(); }, 5000 ) }
使用方法#2 意味着我不需要跟踪时间,或者需要一个特殊的 ID。
但是,假设我有 200 个玩家,它会产生 200 个计时器,那不是效率低下吗?
但是,如果我使用方法#1,它会一直运行,计时器只会每毫秒运行一次,我觉得这也是低效的。
那么,就效率而言(准确性也会很好),哪种方法更好?
解决方案
我的最终代码如下所示:
function Player(_id) {
this.enqueue(_id);
}
Player.prototype = {
queue: [],
constructor: Player,
enqueue: function (_id) {
this.id = _id;
var length = this.queue.push({
expires: new Date().getTime() + 5000,
instance: this
});
if (length === 1) this.dequeue();
},
dequeue: function () {
var player = this.queue[0];
var delay = player.expires - new Date().getTime();
setTimeout(this.act.bind(player.instance,player.id), delay);
},
act: function () {
console.log(this.id);
this.queue.shift();
if (this.queue.length)
this.dequeue();
}
};
如果我在 chrome 中进入开发人员控制台并输入Player(4)
,然后等待 2 秒并输入Player(3)
,我得到 4,然后两秒后 3。
按预期工作,通过查看代码,我只使用了一个 setTimeout。