gpt4 book ai didi

RxJS iif 参数何时不应该被调用

转载 作者:行者123 更新时间:2023-12-04 17:09:46 42 4
gpt4 key购买 nike

我想使用来自 RxJS 的 iif 实用程序有条件地调度一些操作。问题是即使测试函数返回 false,也会调用 iif 的第二个参数。这会引发错误并且应用程序立即崩溃。我对 RxJS 的功能不熟悉,所以我可能不知道什么。如果重要的话,我正在使用 connected-react-router 包。

export const roomRouteEpic: Epic = (action$, state$) =>
action$.ofType(LOCATION_CHANGE).pipe(
采摘('有效载荷'),
合并 map (有效载荷 =>
如果(
() => {
console.log('未记录');
return/^\/room\/\d+$/.test(payload.location.pathname);//设置为“/登录”
},
合并(
tap(v => console.log('NOT LOGGED TOO')),
的(
//立即评估随后的状态值
state$.value.rooms.list[payload.location.pathname.split('/')[1]]
? actions.rooms.initRoomEnter()
:actions.rooms.initRoomCreate(),
),
of(actions.global.setIsLoading(true)),
),
空的(),
),
),
);

最佳答案

聚会有点晚,但我发现了iif的角色是 不是 在另一条路径上执行一条路径,但订阅一个 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/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com