facebook/react · warning

No suspense found with id "${id}"

Error message

No suspense found with id "${id}"

What it means

Store.getSuspenseByID(id) resolves a SuspenseNode from the store's _idToSuspense map, used by the Suspense/Activity tab to map suspended components to their boundary. When the id is not present (the suspense node was removed because its boundary unmounted or the store was rebuilt), it warns and returns null. Like getElementByID, it is a guarded lookup for state that can disappear between commits.

Source

Thrown at packages/react-devtools-shared/src/devtools/store.js:741

    return element;
  }

  _recalculateWeightAcrossRoots(): void {
    let weightAcrossRoots = 0;
    this._roots.forEach(rootID => {
      weightAcrossRoots += this._getElementByIDOrThrow(rootID).weight;
    });
    this._weightAcrossRoots = weightAcrossRoots;
  }

  containsSuspense(id: SuspenseNode['id']): boolean {
    return this._idToSuspense.has(id);
  }

  getSuspenseByID(id: SuspenseNode['id']): SuspenseNode | null {
    const suspense = this._idToSuspense.get(id);
    if (suspense === undefined) {
      console.warn(`No suspense found with id "${id}"`);
      return null;
    }

    return suspense;
  }

  // Returns a tuple of [id, index]
  getElementsWithErrorsAndWarnings(): ErrorAndWarningTuples {
    if (!this._shouldShowWarningsAndErrors) {
      return [];
    }

    if (this._cachedErrorAndWarningTuples !== null) {
      return this._cachedErrorAndWarningTuples;
    }

    const errorAndWarningTuples: ErrorAndWarningTuples = [];

View on GitHub (pinned to eafeac097b)

Solutions

  1. Check store.containsSuspense(id) before getSuspenseByID(id).
  2. Re-derive the suspense set from the current store (e.g. via the suspense context) instead of caching ids.
  3. Clear timeline playback state when the store mutates so stale ids are never queried.

Example fix

// before
const suspense = store.getSuspenseByID(id); // warns when gone

// after
const suspense = store.containsSuspense(id) ? store.getSuspenseByID(id) : null;
Defensive patterns

Strategy: validation

Validate before calling

const suspense = store.containsSuspense(id)
  ? store.getSuspenseByID(id)
  : null;

Prevention

When it happens

Trigger: Looking up a SuspenseNode by id after the boundary unmounted; toggling timeline/playback in the Suspense tab while the underlying tree mutates; holding suspense ids across a store invalidation (e.g. re-profiling or reload).

Common situations: Using the Suspense/Activity DevTools tab on trees that keep changing; navigating away while a suspense timeline is open; embeds that persist suspense ids between sessions.

Related errors


AI-assisted analysis of facebook/react@eafeac097b (2026-08-21). Data as JSON: /api/errors/ffc8e3ec9b024a17. Report an issue: GitHub.