我想使用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 WorldobsTwo$也是如此(除了路径显示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/

10-12 16:26