我想使用RxJS的iif实用程序有条件地调度一些操作。问题是,即使测试函数返回false,也会调用iif的第二个参数。这将引发错误,并且应用程序立即崩溃。我对RxJS的功能是陌生的,因此我可能一无所知。如果有问题,我将使用connected-react-router程序包。
导出const roomRouteEpic:Epic =(action $,state $)=>
action $ .ofType(LOCATION_CHANGE).pipe(
采摘('payload'),
mergeMap(有效载荷=>
iif(
()=> {
console.log('NOT LOGGED');
返回/^\/room\/\d+$/.test(payload.location.pathname);//设置为'/login'
},
合并(
点击(v => console.log('NOT LOGGED TOO')),
的(
//立即评估以下状态值
state $ .value.rooms.list [payload.location.pathname.split('/')[1]]
? actions.rooms.initRoomEnter()
:actions.rooms.initRoomCreate(),
),
的(actions.global.setIsLoading(true)),
),
空的(),
),
),
);
最佳答案
聚会晚了一点,但是我发现iif
的角色是,而不是,它的作用是执行一条路径而不是另一条路径,而是订阅一个Observable或另一个Observable。也就是说,它将执行获取每个Observable所需的所有代码路径。
从这个例子中...
import { iif, of, pipe } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
const source$ = of('Hello');
const obsOne$ = (x) => {console.log(`${x} World`); return of('One')};
const obsTwo$ = (x) => {console.log(`${x}, Goodbye`); return of('Two')};
source$.pipe(
mergeMap(v =>
iif(
() => v === 'Hello',
obsOne$(v),
obsTwo$(v)
))
).subscribe(console.log);
您将获得以下输出Hello World
Hello, Goodbye
One
这是因为,为了获得obsOne$
,需要打印Hello World
。 obsTwo$
也是如此(除了路径显示Hello, Goodbye
之外)。但是,您会注意到它仅显示
One
而不显示Two
。这是因为iif
评估为true
,因此订阅了obsOne$
。当您进行三元操作时-我发现本文解释了一种更加RxJS驱动的方法,可以很好地实现所需的结果:https://rangle.io/blog/rxjs-where-is-the-if-else-operator/
关于RxJS iif参数在不应该被调用的时候被调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54097971/