diff --git a/src/core/ticker/Ticker.js b/src/core/ticker/Ticker.js index f2a498a..40df138 100644 --- a/src/core/ticker/Ticker.js +++ b/src/core/ticker/Ticker.js @@ -389,15 +389,19 @@ this.deltaTime = elapsedMS * settings.TARGET_FPMS * this.speed; + // Cache a local reference, in-case ticker is destroyed + // during the emit, we can still check for head.next + const head = this._head; + // Invoke listeners added to internal emitter - let listener = this._head.next; + let listener = head.next; while (listener) { listener = listener.emit(this.deltaTime); } - if (!this._head.next) + if (!head.next) { this._cancelIfNeeded(); } diff --git a/src/core/ticker/Ticker.js b/src/core/ticker/Ticker.js index f2a498a..40df138 100644 --- a/src/core/ticker/Ticker.js +++ b/src/core/ticker/Ticker.js @@ -389,15 +389,19 @@ this.deltaTime = elapsedMS * settings.TARGET_FPMS * this.speed; + // Cache a local reference, in-case ticker is destroyed + // during the emit, we can still check for head.next + const head = this._head; + // Invoke listeners added to internal emitter - let listener = this._head.next; + let listener = head.next; while (listener) { listener = listener.emit(this.deltaTime); } - if (!this._head.next) + if (!head.next) { this._cancelIfNeeded(); } diff --git a/test/core/Ticker.js b/test/core/Ticker.js index 776192e..188770f 100644 --- a/test/core/Ticker.js +++ b/test/core/Ticker.js @@ -299,4 +299,24 @@ expect(this.length()).to.equal(length); }); + + it('should destroy on listener', function (done) + { + const ticker = new Ticker(); + const listener2 = sinon.spy(); + const listener = sinon.spy(() => + { + ticker.destroy(); + setTimeout(() => + { + expect(listener2.called).to.be.false; + expect(listener.calledOnce).to.be.true; + done(); + }, 0); + }); + + ticker.add(listener); + ticker.add(listener2, null, PIXI.UPDATE_PRIORITY.LOW); + ticker.start(); + }); });