@@ -622,6 +622,59 @@ describe('resource', () => {
622622 stream . set ( { error : 'fail' } ) ;
623623 expect ( res . value ( ) ) . toBe ( undefined ) ;
624624 } ) ;
625+
626+ it ( 'should interrupt pending request if the same value is set' , async ( ) => {
627+ const counter = signal ( 0 ) ;
628+ const backend = new MockEchoBackend < { counter : number } | null > ( ) ;
629+ const aborted : ( { counter : number } | null ) [ ] = [ ] ;
630+ const echoResource = resource < { counter : number } | null , { counter : number } | null > ( {
631+ request : ( ) => ( { counter : counter ( ) } ) ,
632+ loader : ( { request, abortSignal} ) => {
633+ abortSignal . addEventListener ( 'abort' , ( ) => backend . abort ( request ) ) ;
634+ return backend . fetch ( request ) . catch ( ( reason ) => {
635+ if ( reason === 'aborted' ) {
636+ aborted . push ( request ) ;
637+ }
638+ throw new Error ( reason ) ;
639+ } ) ;
640+ } ,
641+ injector : TestBed . inject ( Injector ) ,
642+ } ) ;
643+
644+ // Start the initial load.
645+ TestBed . flushEffects ( ) ;
646+ await Promise . resolve ( ) ;
647+ expect ( echoResource . status ( ) ) . toBe ( ResourceStatus . Loading ) ;
648+ expect ( echoResource . value ( ) ) . toBe ( undefined ) ;
649+ expect ( echoResource . error ( ) ) . toBe ( undefined ) ;
650+ expect ( aborted ) . toEqual ( [ ] ) ;
651+
652+ // Interrupt by setting a value before the request has resolved.
653+ echoResource . set ( null ) ;
654+ TestBed . flushEffects ( ) ;
655+ await backend . flush ( ) ;
656+ expect ( echoResource . status ( ) ) . toBe ( ResourceStatus . Local ) ;
657+ expect ( echoResource . value ( ) ) . toBe ( null ) ;
658+ expect ( echoResource . error ( ) ) . toBe ( undefined ) ;
659+ expect ( aborted ) . toEqual ( [ { counter : 0 } ] ) ;
660+
661+ // Reload the resource to trigger another request.
662+ echoResource . reload ( ) ;
663+ TestBed . flushEffects ( ) ;
664+ await Promise . resolve ( ) ;
665+ expect ( echoResource . status ( ) ) . toBe ( ResourceStatus . Reloading ) ;
666+ expect ( echoResource . value ( ) ) . toBe ( null ) ;
667+ expect ( echoResource . error ( ) ) . toBe ( undefined ) ;
668+ expect ( aborted ) . toEqual ( [ { counter : 0 } ] ) ;
669+
670+ // Interrupt the reload with the same value as before.
671+ echoResource . set ( null ) ;
672+ await backend . flush ( ) ;
673+ expect ( echoResource . status ( ) ) . toBe ( ResourceStatus . Local ) ;
674+ expect ( echoResource . value ( ) ) . toBe ( null ) ;
675+ expect ( echoResource . error ( ) ) . toBe ( undefined ) ;
676+ expect ( aborted ) . toEqual ( [ { counter : 0 } , { counter : 0 } ] ) ;
677+ } ) ;
625678} ) ;
626679
627680function flushMicrotasks ( ) : Promise < void > {
0 commit comments