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(), + }); + } + }, }), ); }),