莫名其妙的“未定义”计时器变量导致TypeError

时间:2018-12-20 20:08:52

标签: javascript html5 webpack phaser-framework

我试图在create()状态的Game.js函数中,按照以下步骤在相位器中启动一个循环计时器:

    var jackpotTimer = new Phaser.Timer(this.game);
    jackpotTimer.loop(500, function () {
        this.jackpotSignal.dispatch(this.game.rnd,integerInRange(1000, 3000), this.game.rnd.integerInRange(10000, 20000));
    }, this);
    jackpotTimer.start();

在运行时,我收到以下错误:

phaser-split.js:56360 TypeError: Cannot read property 'time' of undefined
at 429.Phaser.Timer.start (phaser-split.js:48661)
at __webpack_exports__.a.initJackpotSocket (RGSCommunicator.js:31)
at __webpack_exports__.b.create (Game.js:117)
at 429.Phaser.StateManager.loadComplete (phaser-split.js:8143)
at 429.Phaser.Loader.finishedLoading (phaser-split.js:55895)
at 429.Phaser.Loader.processLoadQueue (phaser-split.js:55847)
at 429.Phaser.Loader.asyncComplete (phaser-split.js:55923)
at 429.Phaser.Loader.jsonLoadComplete (phaser-split.js:56840)
at XMLHttpRequest.xhr.onload (phaser-split.js:56345)

Phaser.Timer.start中中断的行如下所示:

this._started = this.game.time.time + (delay || 0);

使用chrome调试器,我已经毫无疑问地确认了发生错误时的情况:

  1. this.game的定义正确,可以在“范围”窗口中浏览
  2. this.game具有已定义的time.time属性,可以通过在范围窗口中浏览this.game来找到
  3. 在源代码窗口的time中的this.game.time上移动鼠标会产生“未定义”。
  4. 该错误是由上面引用的计时器实例引起的。

我想知道可能是什么原因造成的。有人看过吗?

我将Phaser-ES6-Webpack堆栈与Phaser CE 2.9.4一起使用

1 个答案:

答案 0 :(得分:0)

我发现语法不会中断并正确执行:

GridView.builder(
    gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
      maxCrossAxisExtent: 150,
      childAspectRatio: 3,
    ),
    itemBuilder: (context, index) {
      return Text("$index: Das ist ein langer Text, der hoffentlich auf viele Zeilen umbricht, aber sonst keinen großen Sinn ergibt");
    },
),

此处的关键似乎是引用var self = this; game.time.events.loop(500, function () { self.jackpotSignal.dispatch(game.rnd.integerInRange(1000, 3000), game.rnd.integerInRange(10000, 20000)); console.log("looped"); }, this); 而不是game,因为此变量似乎在相位器中占有特殊位置,这在javascript中是很不常见的,因为它通常需要显式引用。仍然想知道调试器中观察到的异常行为...