diff --git a/src/Flicking.ts b/src/Flicking.ts index d11033ffd..22d6af9e3 100644 --- a/src/Flicking.ts +++ b/src/Flicking.ts @@ -1503,6 +1503,9 @@ class Flicking extends Component { viewport.resize(); await renderer.forceRenderAllPanels(); // Render all panel elements, to update sizes + if (!this._initialized) { + return; + } renderer.updatePanelSize(); camera.updateAlignPos(); camera.updateRange(); @@ -1511,6 +1514,9 @@ class Flicking extends Component { camera.updatePanelOrder(); camera.updateOffset(); await renderer.render(); + if (!this._initialized) { + return; + } if (control.animating) { // TODO: diff --git a/test/unit/Flicking.spec.ts b/test/unit/Flicking.spec.ts index 82988fb12..a5a3eb8fb 100644 --- a/test/unit/Flicking.spec.ts +++ b/test/unit/Flicking.spec.ts @@ -10,7 +10,7 @@ import { Plugin } from "~/type/external"; import { AfterResizeEvent, BeforeResizeEvent } from "~/type/event"; import El from "./helper/El"; -import { cleanup, createFlicking, range, simulate, tick, waitEvent } from "./helper/test-util"; +import { cleanup, createFlicking, range, simulate, tick, waitEvent, waitTime } from "./helper/test-util"; describe("Flicking", () => { afterEach(() => { @@ -1832,6 +1832,21 @@ describe("Flicking", () => { expect(cameraSpy.calledOnce).to.be.true; expect(rendererSpy.calledOnce).to.be.true; }); + it("should call destroy after resize", async () => { + const flicking = await createFlicking(El.DEFAULT_HORIZONTAL); + + let hasError = false; + flicking.resize().catch(() => { + // Any remaining resize operations that occur after destroy should not operate. + hasError = true; + }); + flicking.destroy(); + + await waitTime(1000); + + // Then + expect(hasError).to.be.equal(false); + }); }); describe("getElement()", () => { diff --git a/test/unit/helper/test-util.ts b/test/unit/helper/test-util.ts index 9e0da6de4..05112e4f2 100644 --- a/test/unit/helper/test-util.ts +++ b/test/unit/helper/test-util.ts @@ -97,4 +97,11 @@ export const waitEvent = (emitter: any, eventName: string) => { } }; + +export const waitTime = (time: number) => { + return new Promise(res => { + (window as any)._real.setTimeout(res, time); + }); +} + export class NullClass {} diff --git a/test/unit/setup.ts b/test/unit/setup.ts index 4edf84c60..cc90e817d 100644 --- a/test/unit/setup.ts +++ b/test/unit/setup.ts @@ -1,3 +1,7 @@ +(window as any)._real = { + setTimeout: (window as any).setTimeout.bind((window as any)), +}; + (window as any).timer = sinon.useFakeTimers(); (window as any).flickings = [];