我有一个非常简单的选择器
\n\nexport const isLoading = createSelector(\n state => state.$loading\n);\nRun Code Online (Sandbox Code Playgroud)\n\n和两个操作StartLayoutNavigationAction,EndLayoutNavigationAction只需$loading相应地设置标志。\n我调用这些函数一次,我的操作就会被记录:
ACTION \xe2\x80\x93 [Layout] Start navigation StartLayoutNavigationAction\xc2\xa0{layout: "login", type: "[Layout] Start navigation"}\nACTION \xe2\x80\x93 [Layout] End navigation EndLayoutNavigationAction\xc2\xa0{type: "[Layout] End navigation"}\nRun Code Online (Sandbox Code Playgroud)\n\n因此,人们会假设选择器将在调用第一个操作时发出一次,在调用第二个操作时发出一次。中间没有任何动作。
\n\n但:
\n\n选择器似乎并行发出两次。我管道如下:
\n\nlayoutLoading$: Observable<boolean> = this.store.pipe(\n select(isLoading),\n distinctUntilChanged((x, y) => {\n console.log("Comparison:", x, y);\n return x === y;\n }),\n tap(value => console.log("New val:", value))\n);\nRun Code Online (Sandbox Code Playgroud)\n\n这是输出:
\n\nACTION \xe2\x80\x93 [Layout] Start navigation StartLayoutNavigationAction\xc2\xa0{layout: "login", type: "[Layout] Start navigation"}\nComparison: false true\nNew val: true\nComparison: false true\nNew val: true\nACTION \xe2\x80\x93 [Layout] End navigation EndLayoutNavigationAction\xc2\xa0{type: "[Layout] End navigation"}\nComparison: true false\nNew val: false\nComparison: true false\nNew val: false\nRun Code Online (Sandbox Code Playgroud)\n\n我是不是搞错了什么?这是预期的行为吗?
\n根据评论
\n\n\n\n\n您确定layoutLoading$只有一个订阅吗?例如,您有多个异步管道、多个组件实例。- @巴吉
\n
const source$ = of(1).pipe(\n tap(value => console.log("New val:", value))\n);\n\nsource$.subscribe();\nsource$.subscribe();\n// 1\n// 1\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n好吧,你是对的,我有两个异步订阅。我不知道\n这适用于每个订阅。因此,当我想要对不同的更改做出反应(除了异步管道之外)时,我将需要第二个可观察管道,对吧?- @Giacomo Vo\xc3\x9f
\n
是的,如果我理解正确的话:
\n\nsource$\n .pipe(distinctUntilChanged(fn))\n .subscribe(/* do something */)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2356 次 |
| 最近记录: |