From c4f7a660242df9d37aa086f96d79350423a20a18 Mon Sep 17 00:00:00 2001 From: Hung Pham Date: Sat, 2 May 2026 08:19:03 +0700 Subject: [PATCH] fix: fix deleteOldTopics logic --- .../src/app/app.service.ts | 40 ++++++++++++++++--- .../src/app/localDB.service.ts | 6 +-- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/apps/rxjs/11-high-order-operator-bug/src/app/app.service.ts b/apps/rxjs/11-high-order-operator-bug/src/app/app.service.ts index df2269a89..83b9c4101 100644 --- a/apps/rxjs/11-high-order-operator-bug/src/app/app.service.ts +++ b/apps/rxjs/11-high-order-operator-bug/src/app/app.service.ts @@ -1,5 +1,5 @@ import { inject, Injectable } from '@angular/core'; -import { merge, Observable, of } from 'rxjs'; +import { catchError, forkJoin, map, Observable, of, tap } from 'rxjs'; import { LocalDBService, TopicType } from './localDB.service'; @Injectable({ providedIn: 'root' }) @@ -10,10 +10,38 @@ export class AppService { deleteOldTopics(type: TopicType): Observable { const infoByType = this.dbService.searchByType(type); - return infoByType.length > 0 - ? infoByType - .map((t) => this.dbService.deleteOneTopic(t.id)) - .reduce((acc, curr) => merge(acc, curr), of(true)) - : of(true); + + if (!infoByType?.length) { + return of(true); + } + + const requests$ = infoByType.map((t) => + this.dbService.deleteOneTopic(t.id).pipe( + tap((result) => { + if (result) { + console.log(`${type} with id ${t.id} deleted successfully.`); + } else { + console.error(`Failed to delete ${type} with id ${t.id}.`); + } + }), + catchError((error) => { + console.error( + `There was an error while deleting ${type} with id ${t.id}.`, + error, + ); + return of(false); + }), + ), + ); + + return forkJoin(requests$).pipe( + tap((results) => + console.log( + `All deletion requests for ${type} completed with results:`, + results, + ), + ), + map((results) => results.every((r) => r)), + ); } } diff --git a/apps/rxjs/11-high-order-operator-bug/src/app/localDB.service.ts b/apps/rxjs/11-high-order-operator-bug/src/app/localDB.service.ts index 5a035e087..0630dca92 100644 --- a/apps/rxjs/11-high-order-operator-bug/src/app/localDB.service.ts +++ b/apps/rxjs/11-high-order-operator-bug/src/app/localDB.service.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/member-ordering */ import { randomError } from '@angular-challenges/shared/utils'; import { computed, Injectable, signal } from '@angular/core'; -import { of } from 'rxjs'; +import { Observable, of, throwError } from 'rxjs'; export type TopicType = 'food' | 'book' | 'sport'; @@ -42,12 +42,12 @@ export class LocalDBService { this.state.set({ infos: this.state().infos.filter((i) => i.id !== id) }); }; - deleteOneTopic = (id: number) => + deleteOneTopic = (id: number): Observable => randomError({ success: () => { this.deleteOne(id); return of(true); }, - error: () => of(false), + error: () => throwError(() => new Error('Random error occurred')), }); }