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
- Check store.containsSuspense(id) before getSuspenseByID(id).
- Re-derive the suspense set from the current store (e.g. via the suspense context) instead of caching ids.
- 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
- Use store.containsSuspense(id) before getSuspenseByID(id).
- Reset Suspense tab timeline state when the store mutates.
- Re-derive suspense ids from the current tree instead of caching them.
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
- No element found with id "${id}"
- Cannot not suspend ID '${suspendedSet[i]}'.
- Invalid renderer id "${match.rendererID}" for element "${mat
- Invalid index ${index} specified; store contains ${this.numE
- The should not be any remaining suspense node children if th
AI-assisted analysis of facebook/react@eafeac097b (2026-08-21).
Data as JSON: /api/errors/ffc8e3ec9b024a17.
Report an issue: GitHub.