用管道控制Observables

时间:2018-06-01 13:45:48

标签: angular typescript rxjs observable

我想知道是否有一种更优雅的方式来处理这段代码

return new Observable(subscriber => {
    let subscription = this.anotherObservable().subscribe(
        (next) => {
            if (this.condition1(next)) {
                subscriber.next(next);
            } else if (this.condition2(next)) {
                subscriber.complete();
            } else {
                subscriber.error('there was an error');
            }
        },
        (error) => subscriber.error(error),
        () => subscriber.complete()
    );

    return () => subscription.unsubscribe();
});

此代码位于类中的方法内。

anotherObservable会返回一个Observable,它会根据condition1值发出不同类型的数据,这就是condition2next布尔值的原因。

我的问题是,我错过了一些操作符组合,它们可以使用相同的行为来处理这个Observable,但使用管道而不是重写" custom"可观察到的?

1 个答案:

答案 0 :(得分:2)

使用takeWhile和flatMap的组合:

const subscription = anotherObservable.pipe(
      takeWhile(someValue => !this.condition2(someValue)),
      flatMap(someValue => {
        if(this.condition1(someValue)) {
          return of(someValue);
        }
        return throwError('there was an error');
      })
    ).subscribe(someValue => //do something with value);