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