如何转换两个obserables流

时间:2018-05-15 05:06:08

标签: angular merge rxjs observable

我有两个可观察者Observable<boolean> 我想合并结果,例如false + falsefalse+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]运营商&#39; +&#39;不能应用于类型&#39; {}&#39;和布尔&#39;。

UPDATE2

.subscribe()

上不存在

combineLatest()

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

[ts] Property&#39; subscribe&#39;类型&#39; OperatorFunction&lt; {}上不存在,   数&GT;&#39;

UPDATE3:
我在Why `combineLatest` returns OperatorFunction<{}, number>

找到了我的问题的答案

2 个答案:

答案 0 :(得分:2)

  

[ts]属性'subscribe'在类型'OperatorFunction&lt; {},number&gt;'上不存在。

如果要更改需要使用cd /home # or whatever your home path for d in * # iterate everything do if [[ -d "$d" && "$d" != "lost+found" ]] # process dirs but not lost+found then # add others if needed echo Processing "$d" continue # REMOVE WHEN YOU UNDERSTAND THE SCRIPT continue # ARE YOU SURE continue # THIS IS YOUR LAST WARNING u=$(stat -c "%U" "$d") # get user of each dir mkdir -p "$d"/new_dir # creat the dir regardles if exists chown "$u" "$d"/new_dir # set ownership to rightful owner fi # consider setting group ownership done 的类型,则尝试将输出从布尔值转换为数字时会出现此错误,但一次只需要一个可观察的流,据我所知。

建议您使用下面给出的SwitchMap来解决您的问题。

作为布尔结果,您应该应用逻辑运算符(&amp;&amp;或||)来获取输出,而不是数值运算符

forkjoin

正如您已经知道的那样,您将收到两个值,即您有固定数量的请求,并且两者都需要完成才能获得结果,那么您应该使用forkJoin

 (val1, val2) => val1 && val2 

你想要实现的目标并不多,但是如果你想申请async getResult() { const example = await forkJoin( request1, request2).toPromise(); const output = example [0] && example[1]; } 那么你应该将你的布尔值转换成如下所示的数字

+

答案 1 :(得分:0)

您可以使用mapXXX运算符来实现它。 对于Ex:

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