diff --git a/packages/state/src/lib/core/Computed.ts b/packages/state/src/lib/core/Computed.ts index 290f8c97d..2d82490d6 100644 --- a/packages/state/src/lib/core/Computed.ts +++ b/packages/state/src/lib/core/Computed.ts @@ -4,7 +4,7 @@ import { HistoryBuffer } from './HistoryBuffer' import { maybeCaptureParent, startCapturingParents, stopCapturingParents } from './capture' import { GLOBAL_START_EPOCH } from './constants' import { EMPTY_ARRAY, equals, haveParentsChanged, singleton } from './helpers' -import { getGlobalEpoch } from './transactions' +import { getGlobalEpoch, getIsReacting } from './transactions' import { Child, ComputeDiff, RESET_VALUE, Signal } from './types' import { logComputedGetterWarning } from './warnings' @@ -189,8 +189,15 @@ class __UNSAFE__Computed implements Computed __unsafe__getWithoutCapture(ignoreErrors?: boolean): Value { const isNew = this.lastChangedEpoch === GLOBAL_START_EPOCH - if (!isNew && (this.lastCheckedEpoch === getGlobalEpoch() || !haveParentsChanged(this))) { - this.lastCheckedEpoch = getGlobalEpoch() + const globalEpoch = getGlobalEpoch() + + if ( + !isNew && + (this.lastCheckedEpoch === globalEpoch || + (this.isActivelyListening && getIsReacting() && this.lastTraversedEpoch < globalEpoch) || + !haveParentsChanged(this)) + ) { + this.lastCheckedEpoch = globalEpoch if (this.error) { if (!ignoreErrors) { throw this.error.thrownValue diff --git a/packages/state/src/lib/core/transactions.ts b/packages/state/src/lib/core/transactions.ts index afb92d7d1..0e3672eee 100644 --- a/packages/state/src/lib/core/transactions.ts +++ b/packages/state/src/lib/core/transactions.ts @@ -70,6 +70,10 @@ export function getGlobalEpoch() { return inst.globalEpoch } +export function getIsReacting() { + return inst.globalIsReacting +} + /** * Collect all of the reactors that need to run for an atom and run them. *