【发布时间】:2019-05-07 20:04:48
【问题描述】:
我用两个按钮(searchButton、lazyButton)编写了一个组件。 ngOnDestroy 是:
public ngOnDestroy() {
this.unsubscribe$.next();
this.unsubscribe$.complete();
}
我从两个按钮点击事件中创建了两个可观察对象:
this.eager$ = Rx.Observable.fromEvent(this.searchButton, 'click')
.takeUntil(this.$unsubscribe);
this.lazy$ = Rx.Observable.fromEvent(this.lazyButton, 'click')
.takeUntil(this.$unsubscribe);
所以,当组件被销毁时,两个 observable 都会自动取消订阅。
另一方面,每次单击按钮时,我都需要发出一个 http 请求:
Observable
.merge(this.eager$, this.lazy$)
.switchMap(() => this.service.getItemsFromStorage())
所以,从现在开始,我会收到Observable<Response>。所以我需要处理响应:
Observable
.merge(this.eager$, this.lazy$)
.switchMap(() => this.service.getItemsFromStorage())
.map(response => response.json()) (****)
.map(page => <Array<AdministrationUser>>page.included) (****)
所以,在那之后,我收到了Observable<Array<AdministrationUser>>。
首先,我需要对每个AdministrationUser 应用一些转换。所以我需要创建一个Observable<AdministrationUser>:
Observable
.merge(this.eager$, this.lazy$)
.switchMap(() => this.service.getItemsFromStorage())
.map(response => response.json())
.map(page => <Array<AdministrationUser>>page.included)
.switchMap(page => Observable.from(page.users)) (****)
所以,现在我可以修改每个用户了:
Observable
.merge(this.eager$, this.lazy$)
.switchMap(() => this.service.getItemsFromStorage())
.map(response => response.json())
.map(page => <Array<AdministrationUser>>page.included)
.switchMap(page => Observable.from(page.users))
.do(user => /*modify user*/) (****)
所以在那之后,我只需要再次收集所有接收到的用户:
Observable
.merge(this.eager$, this.lazy$)
.switchMap(() => this.service.getItemsFromStorage())
.map(response => response.json())
.map(page => <Array<AdministrationUser>>page.included)
.switchMap(page => Observable.from(page.users))
.do(user => /*modify user*/)
.reduce((acc, value) => [...acc, value], []) (****)
.do(users => this.rowsToShow = [...users]) (&&$$&&)
.takeUntil(this.unsubscribe$)
.subscribe();
一旦再次收集所有用户,他们必须分配到rowsToShow字段。
问题是(&&$$&&)上的代码从未到达过。
我猜是由于reduce 的行为是等待dor observable 结束。但是,我不知道为什么当我编码后它永远不会结束,一旦达到 http 响应,observable 就会变成.switchMap(page => Observable.from(page.users))。因此 observable 切换到数组元素的 observable ,当数组全部交叉时自动结束。
有什么想法吗?
【问题讨论】:
-
不会放弃旧版本的
rxjs是吗?
标签: angular typescript rxjs