gpt4 book ai didi

javascript - RxJs 运算符在每次迭代结束时无条件执行

转载 作者:行者123 更新时间:2023-11-28 17:12:09 25 4
gpt4 key购买 nike

是否有 Rx 运算符或组合来保证每个可观察发射最后执行一些逻辑?

让我们假设以下上下文:

  1. 无尽或连续的序列
  2. 条件逻辑,例如 filter(),用于跳过一些排放
  3. 类似 doAlways() 的运算符中每次迭代结束时的一些逻辑

请参阅下面代码示例中的编号注释

注释:

  • finalize() 需要序列终止(违反 p.1)
  • iif()switchMap() 内的常规 if 是一个选项,但会使代码更难以阅读

用于说明的代码片段: 步骤 (3) 应始终、每次迭代、最后执行,即我们希望始终在 doAlways() 中开始和完成日志 - like 运算符代替 tap()

import { of, interval } from 'rxjs'; 
import { tap, filter, switchMap } from 'rxjs/operators';


const dataService = { update: (z) => of(z /*posts data to back-end*/) };

const sub = interval(1000).pipe( // <-- (1)
tap(a => console.log('starting', a)),
filter(b => b % 100 === 0), // <-- (2)
switchMap(c => dataService.update(c)),
tap(d => console.log('finishing', d)) // <-- (3) should execute always even (2)
)
.subscribe(x => console.log(x));

最佳答案

不存在这样的运算符,那是因为它不可能存在。一旦你过滤掉了一个值,得到的可观察值就不再发出它了。任何“下游”运营商根本不知道它的存在。

为了说明这一点,您在某些服务中包含了一个 switchMap,这取决于发出的值。由于明显的原因,如果没有要打开的值,则逻辑上无法应用该运算符。

您必须“标记”每个值而不是过滤它,并将过滤器推迟到点击调用之后,但即使如此,切换到另一个可观察的场景也需要更详细的要求。

<小时/>

将可观察对象视为您在其上放置元素的传送带。每个运算符(operator)都是一个房间,皮带穿过该房间。在每个房间内, worker 可以决定如何处理每件元素:修改它、拿走它、放入新元素等。但是,每个 worker 只能看到传送带带来的东西 - 他们不知道其他房间带来了什么在他们之前或那里已经做了什么。

为了实现你想要的目标,最后一个房间的 worker 必须了解他从未收到过的元素,这需要他们不具备的额外知识。

关于javascript - RxJs 运算符在每次迭代结束时无条件执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54153294/

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