用combineAll代替switchMap和map?
Using combineAll to replace switchMap and map?
我尝试使用 combineAll
来组合所有内容,我尝试了不同的组合但无法正常工作。
但是我通过对所有这些 switchMap/map 进行这种丑陋的嵌套,设法获得了一些工作代码。
如何使用 combineAll
获得相同的结果?
@Effect()
SelectItem$: Observable<Action> = this.actions$
.ofType(supernode.ActionTypes.SET_SELECTED_ITEM)
.debounceTime(100)
.switchMap(() => {
return this.itemService.isEditable().switchMap(
edit => this.itemService.isSharable().switchMap(
share => this.itemService.isListable().map(
list => new item.SetShareStatus({
listable: list, editable: edit, sharable: share
})
)
)
).take(1);
})
.catch(this.handleError);
我建议改用 combineLatest
运算符:
...
.switchMap(() =>
Observable.combineLatest(
this.itemService.isEditable(),
this.itemService.isSharable(),
this.itemService.isListable(),
(editable, sharable, listable) =>
new SetShareStatus({ editable, sharable, listable })
)
.take(1)
)
combineAll
应该应用于高阶可观察量,即可观察量的可观察量,所以如果你真的想使用它,那么你需要创建一个高阶可观察量首先是 observables,例如:
Observable.of(
this.itemService.isEditable(),
this.itemService.isSharable(),
this.itemService.isListable()
)
.combineAll((editable, sharable, listable) =>
new SetShareStatus({ editable, sharable, listable }))
我不确定你调用的所有函数应该做什么,但在我看来你既不需要使用 combineAll
也不需要使用 switchMap
。我认为 zip()
或 forkJoin()
:
会更好
.switchMap(() => Observable.forkJoin(
this.itemService.isEditable()
this.itemService.isSharable()
this.itemService.isListable()
))
.map(results => new SetShareStatus({
listable: results[2], editable: results[1], sharable: results[1]
}))
})
我认为 combineLatest()
不是一个好的选择,因为它会在它的任何源 Observable 发出时发出,而我认为这是你不想要的。
我尝试使用 combineAll
来组合所有内容,我尝试了不同的组合但无法正常工作。
但是我通过对所有这些 switchMap/map 进行这种丑陋的嵌套,设法获得了一些工作代码。
如何使用 combineAll
获得相同的结果?
@Effect()
SelectItem$: Observable<Action> = this.actions$
.ofType(supernode.ActionTypes.SET_SELECTED_ITEM)
.debounceTime(100)
.switchMap(() => {
return this.itemService.isEditable().switchMap(
edit => this.itemService.isSharable().switchMap(
share => this.itemService.isListable().map(
list => new item.SetShareStatus({
listable: list, editable: edit, sharable: share
})
)
)
).take(1);
})
.catch(this.handleError);
我建议改用 combineLatest
运算符:
...
.switchMap(() =>
Observable.combineLatest(
this.itemService.isEditable(),
this.itemService.isSharable(),
this.itemService.isListable(),
(editable, sharable, listable) =>
new SetShareStatus({ editable, sharable, listable })
)
.take(1)
)
combineAll
应该应用于高阶可观察量,即可观察量的可观察量,所以如果你真的想使用它,那么你需要创建一个高阶可观察量首先是 observables,例如:
Observable.of(
this.itemService.isEditable(),
this.itemService.isSharable(),
this.itemService.isListable()
)
.combineAll((editable, sharable, listable) =>
new SetShareStatus({ editable, sharable, listable }))
我不确定你调用的所有函数应该做什么,但在我看来你既不需要使用 combineAll
也不需要使用 switchMap
。我认为 zip()
或 forkJoin()
:
.switchMap(() => Observable.forkJoin(
this.itemService.isEditable()
this.itemService.isSharable()
this.itemService.isListable()
))
.map(results => new SetShareStatus({
listable: results[2], editable: results[1], sharable: results[1]
}))
})
我认为 combineLatest()
不是一个好的选择,因为它会在它的任何源 Observable 发出时发出,而我认为这是你不想要的。