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

У меня есть две наблюдаемые Observable<boolean> Я хочу объединить результаты, например false + false, false+true и т. Д.

this.loaded$.pipe(
  merge(this.loading$)
).subscribe(console.log); //`false`,`false`; `true`,`false`; etc

чем я хочу преобразовать поток в единственную логическую наблюдаемую на основе условия:
если val1+val2 == 1 - вернуть false; если val1+val2 !== 1 - вернуть true;

Итак, вопрос в том, как бы вы преобразовали merged наблюдаемые?

Update1:
Пытался использовать combineLatest, но получил проблему:

combineLatest(
  this.loaded$, this.loading$,
  (val1, val2) => val1 + val2 === 1
);

[ts] Оператор '+' нельзя применить к типам '{}' и 'boolean'.

UPDATE2

.subscribe() не существует combineLatest()

    combineLatest(
          this.loaded$, this.loading$,
          (val1, val2) => (val1, val2) => Number(val1) + Number(val2) === 1
        ).subscribe(); // does not work

[ts] Свойство «подписка» не существует для типа «OperatorFunction <{}, число>».

Update3:
Я нашел ответ на свой вопрос здесь Почему `ОбъединитьПоследний` возвращает OperatorFunction <{}, число>

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

[ts] Свойство «подписка» не существует для типа «OperatorFunction <{}, number>».

вы получаете эту ошибку, когда пытаетесь преобразовать выходные данные из логического значения в число, если вы хотите изменить тип, который необходимо использовать для SwitchMap, но он принимает только один наблюдаемый поток за раз, согласно мои знания.

Поэтому предложите использовать forkjoin, как указано ниже, что также решит вашу проблему.


как его логический результат, вы должны применить логический оператор (&& или ||) для получения результата вместо числового оператора

 (val1, val2) => val1 && val2 

Как вы уже знаете, вы получите два значения, т. Е. У вас есть фиксированный номер запроса, и оба должны быть завершены для получения результата, тогда вы должны использовать forkJoin

async getResult()
{
    const example = await forkJoin( request1, request2).toPromise();
    const output = example [0] && example[1];
}

Не очень много, чего вы пытаетесь достичь, но если вы хотите применить +, вам следует преобразовать логическое число в число, как показано ниже

 (val1, val2) => Number(val1) + Number(val2);
0 голосов
/ 15 мая 2018

Вы можете использовать операторы mapXXX для достижения этой цели. Например:

this.loaded$.pipe(
  merge(this.loading$),
  map((value) =>  val > 5 ? true : false)
).subscribe(console.log); //`false`,`false`; `true`,`false`; etc
...