{"record":{"id":"ffc8e3ec9b024a17","repo":"facebook/react","slug":"no-suspense-found-with-id-id","errorCode":null,"errorMessage":"No suspense found with id \"${id}\"","messagePattern":"No suspense found with id \"(.+?)\"","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/react-devtools-shared/src/devtools/store.js","lineNumber":741,"sourceCode":"    return element;\n  }\n\n  _recalculateWeightAcrossRoots(): void {\n    let weightAcrossRoots = 0;\n    this._roots.forEach(rootID => {\n      weightAcrossRoots += this._getElementByIDOrThrow(rootID).weight;\n    });\n    this._weightAcrossRoots = weightAcrossRoots;\n  }\n\n  containsSuspense(id: SuspenseNode['id']): boolean {\n    return this._idToSuspense.has(id);\n  }\n\n  getSuspenseByID(id: SuspenseNode['id']): SuspenseNode | null {\n    const suspense = this._idToSuspense.get(id);\n    if (suspense === undefined) {\n      console.warn(`No suspense found with id \"${id}\"`);\n      return null;\n    }\n\n    return suspense;\n  }\n\n  // Returns a tuple of [id, index]\n  getElementsWithErrorsAndWarnings(): ErrorAndWarningTuples {\n    if (!this._shouldShowWarningsAndErrors) {\n      return [];\n    }\n\n    if (this._cachedErrorAndWarningTuples !== null) {\n      return this._cachedErrorAndWarningTuples;\n    }\n\n    const errorAndWarningTuples: ErrorAndWarningTuples = [];\n","sourceCodeStart":723,"sourceCodeEnd":759,"githubUrl":"https://github.com/facebook/react/blob/eafeac097ba51e1eab809c07102126bd5f8e5425/packages/react-devtools-shared/src/devtools/store.js#L723-L759","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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."],"exampleFix":"// before\nconst suspense = store.getSuspenseByID(id); // warns when gone\n\n// after\nconst suspense = store.containsSuspense(id) ? store.getSuspenseByID(id) : null;","handlingStrategy":"validation","validationCode":"const suspense = store.containsSuspense(id)\n  ? store.getSuspenseByID(id)\n  : null;","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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."],"tags":["react-devtools","store","suspense","element-lookup","dev-only"],"backgroundTag":"stale-element-reference","analyzedSha":"eafeac097ba51e1eab809c07102126bd5f8e5425","analyzedAt":"2026-08-21T22:01:08.818Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}