diff --git a/src/now.ts b/src/now.ts index b84bf3a..bbce10a 100644 --- a/src/now.ts +++ b/src/now.ts @@ -5,6 +5,15 @@ const tickers: { [interval: string]: IResource } = {} +export function clearTimers() { + for (const key in tickers) { + if (tickers.hasOwnProperty(key)) { + tickers[key].dispose() + delete tickers[key] + } + } +} + /** * Returns the current date time as epoch number. * The date time is read from an observable which is updated automatically after the given interval. @@ -36,6 +45,7 @@ export function now(interval: number | "frame" = 1000) { // See #40 return Date.now() } + if (!tickers[interval]) { if (typeof interval === "number") tickers[interval] = createIntervalTicker(interval) else tickers[interval] = createAnimationFrameTicker() diff --git a/test/now.js b/test/now.js index 3752eb4..d9cb877 100644 --- a/test/now.js +++ b/test/now.js @@ -54,3 +54,40 @@ test("now should be up to date when ticker is reactivated, #271", (done) => { done() }, 200) }) + +describe("given desynchronization is enabled", () => { + let actual + + beforeEach(() => { + jest.useFakeTimers("modern") + jest.setSystemTime(new Date("2015-10-21T07:28:00Z")) + + const someComputed = mobx.computed(() => { + const currentTimestamp = utils.now(1000) + + return currentTimestamp > new Date("2015-10-21T07:28:00Z").getTime() + }) + + mobx.observe( + someComputed, + (changed) => { + actual = changed.newValue + }, + true + ) + }) + + afterEach(() => { + utils.clearTimers() + }) + + it("given time passes, works", () => { + jest.advanceTimersByTime(1000) + + expect(actual).toBe(true) + }) + + it("does not share the state from previous test", () => { + expect(actual).toBe(false) + }) +})