You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用setInterval执行Warriors类的randomizeWinner函数?

问题解决

核心错误修正

你的代码存在三处关键问题,逐一修正后即可正常运行:

  1. 随机索引计算错误
    原代码中Math.floor(Math.random() * this.playersArray.length - 1)会产生负数索引(当Math.random()返回0时,结果为-1),正确的随机索引应取0到数组长度-1之间的整数,改为:
const random = Math.floor(Math.random() * this.playersArray.length);
  1. splice方法参数错误
    splice的第一个参数是元素索引,不是元素值,原代码传入this.playersArray[random]是元素本身,应该直接传计算好的索引random:
const eliminated = this.playersArray.splice(random, 1);
console.log('被淘汰的玩家:', eliminated);
  1. setInterval终止逻辑缺失
    当数组元素被删空后,定时器仍会继续执行导致报错,需要在方法内判断数组长度,为空时清除定时器:

完整修正代码

class Warriors extends User {
  constructor(size) { 
    super(size);
    // 保存定时器ID,用于后续清除
    this.intervalId = null;
  }

  randomizeWinner() {
    // 数组为空时清除定时器并终止执行
    if (this.playersArray.length === 0) {
      clearInterval(this.intervalId);
      console.log('所有玩家已淘汰,停止定时器');
      return;
    }

    const random = Math.floor(Math.random() * this.playersArray.length);
    const eliminated = this.playersArray.splice(random, 1);
    console.log('被淘汰的玩家:', eliminated);
  }
}

const w = new Warriors();
// 保存定时器ID到实例属性,方便后续清除
w.intervalId = setInterval(() => w.randomizeWinner(), 3000);

关于setInterval调用类方法的说明

你原代码中用w.randomizeWinner.bind(w)是可行的,但用箭头函数() => w.randomizeWinner()更直观——箭头函数会自动继承当前作用域的this,不需要手动绑定,两种方式都能保证方法内的this指向Warriors实例。

内容的提问来源于stack exchange,提问作者gerfg grgr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:15:58