用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 发出时发出,而我认为这是你不想要的。