انگولار - اتصال دو مشاهد و حذف مقادیر تکراری
من در Angular 9 به دو متد سرویس به صورت زیر فراخوانی میکنم:
var u1 = this.userService.getByDepartmentId(departmentId).pipe(
map((payload: Payload<GetByDepartmentIdModel[]>) =>
payload.result.map((user: GetByDepartmentIdModel) => {
return {
id: user.id,
forename: user.forename,
surname: user.surname
};
})));
var u2 = this.userService.getByStoreId(storeId).pipe(
map((payload: Payload<GetByStoreIdModel[]>) =>
payload.result.map((user: GetByStoreIdModel) => {
return {
id: user.id,
forename: user.forename,
surname: user.surname
};
})));
متدهای getByDepartmentId و getByStoreId یک Observable<Payload<GetByDepartmentIdModel[]> و Observable<Payload<GetByStoreIdModel[]>> را برمیگردانند.
چگونه میتوانم دو پاسخ، u1 و u2 را به هم وصل کنم و دوبارهها را حذف کنم (مقایسه user.id)؟
پاسخ شماره ۱
خوب، ابتدا از forkJoin برای ترکیب observables استفاده میکنید، پس از آن یک روش آرایهای ساده concat با filter انجام میدهید، آن را به شیء مورد نظر خود نگاشت میکنید، و تمام شد:
forkJoin([
this.userService.getByDepartmentId(departmentId),
this.userService.getByStoreId(storeId)
]).pipe(
map(([ depPayload, storePayload ]) => depPayload.result.concat(storePayload.result)
.filter(({ id }, i, arr) => arr.findIndex((subj) => subj.id === id) === i)
.map(({ id, forename, surname }) => ({ id, forename, surname })
);
پاسخ شماره ۲
شما میتوانید از forkJoin استفاده کنید.
const users = new Subject();
forkJoin([u1, u2]).subscribe([u1, u2] => {
if (u1.id === u2.id) {
users.next(u1);
} else {
users.next(u1);
users.next(u2);
}
});
و در users مشترک شوید.
users.subscribe(user => ...);
پینوشت: توجه داشته باشید که forkJoin تا زمانی که هر دو observable کامل نشدهاند، صبر میکند. شاید بخواهید به جای آن از combineLatest یا zip استفاده کنید. برای یادگیری بیشتر اینجا را ببینید: https://scotch.io/tutorials/rxjs-operators-for-dummies-forkjoin-zip-combinelatest-withlatestfrom
توضیح: لطفاً از var استفاده نکنید. از const یا let استفاده کنید.
