Контроль наблюдаемых с трубами - PullRequest
0 голосов
/ 01 июня 2018

Мне интересно, есть ли более элегантный способ обработки этого бита кода

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();
});

Этот код находится внутри метода в классе.

Возвращается anotherObservableObservable, которые испускают данные другого типа, поэтому condition1 и condition2 являются логическими значениями, основанными на значении next.

Мой вопрос: я пропускаю некоторые комбинации операторов, которые могли бы обрабатывать это Observable с помощьютакое же поведение, но с использованием каналов вместо переписывания "пользовательского" Observable?

1 Ответ

0 голосов
/ 01 июня 2018

используйте комбинацию 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);
...