{"record":{"id":"b23e31d12bb86d69","repo":"microsoft/playwright","slug":"resulting-promise-was-garbage-collected","errorCode":null,"errorMessage":"Resulting promise was garbage collected.","messagePattern":"Resulting promise was garbage collected\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/server/chromium/crExecutionContext.ts","lineNumber":108,"sourceCode":"\n  async releaseHandle(handle: js.JSHandle): Promise<void> {\n    if (!handle._objectId)\n      return;\n    await releaseObject(this._client, handle._objectId);\n  }\n\n  shouldPrependErrorPrefix(): boolean {\n    return false;\n  }\n}\n\nfunction rewriteError(error: Error): Protocol.Runtime.evaluateReturnValue {\n  if (error.message.includes('Object reference chain is too long') || error.message.includes('CBOR: stack limit exceeded'))\n    throw new Error('Cannot serialize result: object reference chain is too long.');\n  if (error.message.includes('Object couldn\\'t be returned by value'))\n    return { result: { type: 'undefined' } };\n  if (error.message.includes('Promise was collected'))\n    throw new Error('Resulting promise was garbage collected.');\n\n  if (error instanceof TypeError && error.message.startsWith('Converting circular structure to JSON'))\n    rewriteErrorMessage(error, error.message + ' Are you passing a nested JSHandle?');\n  if (!js.isJavaScriptErrorInEvaluate(error) && !isSessionClosedError(error))\n    throw new Error('Execution context was destroyed, most likely because of a navigation.');\n  throw error;\n}\n\nfunction potentiallyUnserializableValue(remoteObject: Protocol.Runtime.RemoteObject): any {\n  const value = remoteObject.value;\n  const unserializableValue = remoteObject.unserializableValue;\n  return unserializableValue ? js.parseUnserializableValue(unserializableValue) : value;\n}\n\nfunction renderPreview(object: Protocol.Runtime.RemoteObject): string | undefined {\n  if (object.type === 'undefined')\n    return 'undefined';\n  if ('value' in object)","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/server/chromium/crExecutionContext.ts#L90-L126","documentation":"Rewritten in rewriteError() (crExecutionContext.ts:108) when CDP reports 'Promise was collected'. The promise returned by an evaluated async function was garbage-collected in the page before it settled, so its resolution cannot be delivered.","triggerScenarios":"page.evaluate(() => someAsyncWork()) where the work loses its only reference; returning a promise that the page lets go of (fire-and-forget); awaiting on a promise stored in a weak map.","commonSituations":"Returning fetch().then() chains without retaining them; awaiting promises that the SPA drops after re-render; long-running tasks that lose their root reference.","solutions":["Store the promise in a page-scope variable (e.g. window.__pending) so it stays reachable, then return it.","Use page.waitForFunction with a polling predicate instead of returning a long-lived promise.","Run the async work to completion inside evaluate and return only the final primitive."],"exampleFix":"// before\nconst ok = await page.evaluate(() => fetch('/x').then(r => r.ok));\n// after\nconst ok = await page.evaluate(async () => {\n  const p = fetch('/x').then(r => r.ok);\n  window.__pending = p;\n  return await p;\n});","handlingStrategy":"validation","validationCode":"// Keep the promise reachable in page scope until it settles.\nconst ok = await page.evaluate(async () => {\n  const p = fetch('/x').then(r => r.ok);\n  (window as any).__pending = (window as any).__pending || [];\n  (window as any).__pending.push(p);\n  return await p;\n});","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Avoid returning fire-and-forget promises from evaluate.","Use page.waitForFunction for conditions that take time to become true.","If you must return a promise, retain it on a page-level variable."],"tags":["evaluate","promise","gc","chromium"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}