首页 > 解决方案 > 流的映射,我应该改变主流吗?

问题描述

在服务内部,我从服务器获取数据并将其推送到流中:

public rights$ = new BehaviorSubject([]);
public users$ = new BehaviorSubject([]);

.subscribe((res => {
    this.rights$.next(res.rights);
    this.users$.next(res.users);
});

我这样做是为了在某些应用程序的地方共享初始数据。但在一个地方我需要映射this.users$UserUI输入:

interface UserUI {
   checked: boolean;
   date: Date
}

我应该像在同一个服务核心中一样创建一个新流吗?

public users$ = new BehaviorSubject<User[]>([]);
public usersUI$ = new BehaviorSubject<UserUI[]>([]);

映射:

this.usersUI$ = this.users$.pipe(map((users: User[]) => users.map((user: User) => {..user, checked: true, date: new Date})

或者更好地在我需要的地方进行映射this.usersUI$?最佳做法是什么?

标签: angularrxjs

解决方案


它是一种重复,它会影响性能,你将不得不处理 2 个 observables 而不是一个你根本不需要的 observables,这意味着更多的代码,更多的测试要编写。

我建议您只保留一个users$,在需要调整的地方可以在组件级别进行所以创建共享适配器

userAdapter(user: User): UserUI {
 return {...user, checked: true, date: new Date}
}

并取决于组件中的需求

const usersUI = service.users$.pipe( 
 map((users: User[]) => users.map(u => userAdapter(u)))
)

推荐阅读