From 7b9fbd5e71423364dcf42b94f153dec15eadb948 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Hem=C3=A5ker?= Date: Mon, 2 Feb 2026 14:43:15 +0100 Subject: [PATCH] fix(requests): update request results stuck 'fetching' (#542) Request states are now updated using rxjs finalize() when still status: 'fetching'. This fixes an issue where observables were cached after immediately cancelling them. --- .../requests/src/lib/requests-result.spec.ts | 39 ++++++++++++++++++- packages/requests/src/lib/requests-result.ts | 14 +++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/packages/requests/src/lib/requests-result.spec.ts b/packages/requests/src/lib/requests-result.spec.ts index 67642572..eb681d0a 100644 --- a/packages/requests/src/lib/requests-result.spec.ts +++ b/packages/requests/src/lib/requests-result.spec.ts @@ -9,7 +9,7 @@ import { } from '@ngneat/elf-entities'; import { createTodo, Todo } from '@ngneat/elf-mocks'; import { expectTypeOf } from 'expect-type'; -import { map, tap, timer } from 'rxjs'; +import { map, Observable, tap, timer } from 'rxjs'; import { clearRequestsResult, filterSuccess, @@ -768,4 +768,41 @@ describe('requests result', () => { expect(reqSpy).toHaveBeenCalledTimes(1); expect(spy).toHaveBeenCalledTimes(2); }); + + it('should not cache aborted requests', () => { + jest.useFakeTimers(); + + const reqSpy = jest.fn(); + + function get() { + return new Observable((observer) => { + const id = setTimeout(() => { + observer.next(); + observer.complete(); + }, 1000); + + return () => { + clearTimeout(id); + }; + }).pipe( + trackRequestResult(['todos']), + tap(() => reqSpy()), + ); + } + + const subscription = get().subscribe(); + subscription.unsubscribe(); + + jest.runAllTimers(); + + expect(reqSpy).toHaveBeenCalledTimes(0); + + // Next request should not be cached since the first one was aborted + + get().subscribe(); + + jest.runAllTimers(); + + expect(reqSpy).toHaveBeenCalledTimes(1); + }); }); diff --git a/packages/requests/src/lib/requests-result.ts b/packages/requests/src/lib/requests-result.ts index d6f6486f..f6c2dd2b 100644 --- a/packages/requests/src/lib/requests-result.ts +++ b/packages/requests/src/lib/requests-result.ts @@ -282,6 +282,20 @@ export function trackRequestResult( } } }, + finalize() { + const mainKey = resolveKey(key); + const currentResult = emitters.get(mainKey)?.getValue(); + if (currentResult?.fetchStatus === 'fetching') { + updateRequestResult(key, { + isLoading: false, + isSuccess: false, + isError: false, + status: 'idle', + fetchStatus: 'idle', + staleTime: Date.now(), + }); + } + }, }), ); }),