react/react · error · Error

Did not find a suitable instance for this async info. This i

Error message

Did not find a suitable instance for this async info. This is a bug in React.

What it means

Thrown in insertSuspendedBy when walking up filtered parent instances to find the correct anchor for async info. The loop encounters a Suspense boundary Fiber that is not the expected parent SuspenseNode, so it tries to use that Fiber's parent instead. If that parent is null (meaning the Suspense boundary has no ancestor above it), this fires. The inline comment notes that any Suspense should have at least the host root as parent.

Source

Thrown at packages/react-devtools-shared/src/backend/fiber/renderer.js:2222

    }
    if (parentInstance.kind === FIBER_INSTANCE) {
      const fiber = parentInstance.data;

      if (
        fiber.tag === SuspenseComponent &&
        parentInstance !== parentSuspenseNode.instance
      ) {
        // We're about to attach async info to a Suspense boundary we're not
        // actually considering the parent Suspense boundary for this async info.
        // We must have not found a suitable Fiber inside the fallback (e.g. due to filtering).
        // Use the parent of this instance instead since we treat async info
        // attached to a Suspense boundary as that async info triggering the
        // fallback of that boundary.
        const parent = parentInstance.parent;
        if (parent === null) {
          // This shouldn't happen. Any <Suspense> would have at least have the
          // host root as the parent which can't have a fallback.
          throw new Error(
            'Did not find a suitable instance for this async info. This is a bug in React.',
          );
        }
        parentInstance = parent;
      }
    }

    const suspenseNodeSuspendedBy = parentSuspenseNode.suspendedBy;
    const ioInfo = asyncInfo.awaited;
    let suspendedBySet = suspenseNodeSuspendedBy.get(ioInfo);
    if (suspendedBySet === undefined) {
      suspendedBySet = new Set();
      suspenseNodeSuspendedBy.set(ioInfo, suspendedBySet);
      // We've added a dependency. We must increment the ref count of the environment.
      const env = ioInfo.env;
      if (env != null) {
        const environmentCounts = parentSuspenseNode.environments;
        const count = environmentCounts.get(env);

View on GitHub (pinned to 22e4f993c7)

Solutions

  1. Clear component filters and retry.
  2. Update React DevTools to match your React version.
  3. Report the issue with a reproduction using Suspense + filtering.
Defensive patterns

Strategy: try-catch

Validate before calling

// Before the parent walk, verify the parent chain is non-null
if (parentInstance.parent === null && parentInstance !== parentSuspenseNode.instance) {
  // Skip attachment — the tree is inconsistent
  return;
}

Try / catch

try {
  insertSuspendedBy(asyncInfo);
} catch (e) {
  if (e.message.includes('Did not find a suitable instance')) {
    // Log and continue — the async info will be retried on next commit
    console.warn('Skipping async info attachment due to tree inconsistency', asyncInfo);
  } else {
    throw e;
  }
}

Prevention

When it happens

Trigger: The parent-walk loop in insertSuspendedBy (lines 2196-2228) reaches a SuspenseComponent fiber whose .parent is null while searching for the correct anchor instance. This indicates the DevTools instance tree is inconsistent with the React Fiber tree, typically due to incomplete mount/unmount tracking.

Common situations: Filtering that hides all non-Suspense ancestors; tree corruption from rapid Suspense boundary toggling; DevTools version that does not correctly handle the latest React Suspense internals.

Related errors


AI-assisted analysis of react/react@22e4f993c7 (2026-08-12). Data as JSON: /api/errors/880fdb9c3d37039a. Report an issue: GitHub.