Rxjs 有没有更好的方法,而不是在带有if条件的subscribe中链接subscribe

Rxjs 有没有更好的方法,而不是在带有if条件的subscribe中链接subscribe,rxjs,Rxjs,有没有更好的方法来重新编写此代码并避免订阅链接 我为什么要被锁链锁住?因为我需要在子订阅中输入source1$的输出 我还有if条件,因为我想有条件地调用子订阅 PS我检查了这个解决方案 这是代码和代码 不确定,但似乎需要开关映射或合并映射和iif 从rxjx文件: import { fromEvent, iif, of } from 'rxjs'; import { mergeMap, map, throttleTime, filter } from 'rxjs/operators'; co

有没有更好的方法来重新编写此代码并避免订阅链接

我为什么要被锁链锁住?因为我需要在子订阅中输入
source1$
的输出 我还有
if
条件,因为我想有条件地调用子订阅

PS我检查了这个解决方案

这是代码和代码


不确定,但似乎需要开关映射合并映射iif

从rxjx文件:

import { fromEvent, iif, of } from 'rxjs';
import { mergeMap, map, throttleTime, filter } from 'rxjs/operators';

const r$ = of(`I'm saying R!!`);
const x$ = of(`X's always win!!`);

fromEvent(document, 'mousemove')
  .pipe(
    throttleTime(50),
    filter((move: MouseEvent) => move.clientY < 210),
    map((move: MouseEvent) => move.clientY),
    mergeMap(yCoord => iif(() => yCoord < 110, r$, x$))
  )
  .subscribe(console.log);
import{fromfevent,iif,of}来自'rxjs';
从'rxjs/operators'导入{mergeMap,map,throttleTime,filter};
const r$=of(`I'm say r!!`);
常数x$=of(`x总是赢!!`);
fromEvent(文档“mousemove”)
.烟斗(
节流时间(50),
过滤器((move:MouseEvent)=>move.clientY<210),
map((move:MouseEvent)=>move.clientY),
合并图(yCoord=>iif(()=>yCoord<110,r$,x$)
)
.subscribe(console.log);

是的,有更好的方法

RxJS提供了许多不同的操作符和静态函数,用于组合、过滤和转换观测值。使用库提供的内容时,不需要嵌套订阅

一般来说,我发现在subscribe中根本不做任何逻辑比较简单,而是设计发出所需准确数据的可观察对象

一个简单的例子可能如下所示:

someValue$=source1$.pipe(
开关映射(val1=>useCond1?source2$:of(val1))
);
someValue$.subscribe();
无论何时接收到发射,都将订阅“内部可观测”。上面的逻辑表示要么返回从
source1$
val1
)发出的值,要么根据
useCond1
的值返回
source2$
发出的任何值

因此,
source2$
只有在
useCond1
为true时才会被订阅

注意:
switchMap
中的函数应该返回一个可观察值(因为switchMap订阅了它),因此用于将发出的值转换为可观察值


在您的情况下,假设您希望发出一些计算值,可能基于其他两个源

我们可以使用创建一个基于3个不同来源的单一可观测数据。由于您只想选择调用
source2$
source3$
,因此我们可以根据您的条件定义源。然后,我们可以使用将3个源的值数组转换为所需的输出:

someValue$=source1$.pipe(
开关映射(val1=>{
常数s1$=of(val1);
const s2$=useCond1?source2$:of('default val2');
const s3$=useCond2?source3$:of('default val3');
返回组合测试([s1$、s2$、s3$);
}),
map([val1,val2,val3])=>{
return…//返回所需值的逻辑
})
);
CombineTest
将在任何源发射时发射一个包含每个源最新发射的阵列。这意味着无论何时任何源发生变化,
someValue$
都将发出最新的计算值

import { fromEvent, iif, of } from 'rxjs';
import { mergeMap, map, throttleTime, filter } from 'rxjs/operators';

const r$ = of(`I'm saying R!!`);
const x$ = of(`X's always win!!`);

fromEvent(document, 'mousemove')
  .pipe(
    throttleTime(50),
    filter((move: MouseEvent) => move.clientY < 210),
    map((move: MouseEvent) => move.clientY),
    mergeMap(yCoord => iif(() => yCoord < 110, r$, x$))
  )
  .subscribe(console.log);