javascript - 在每次迭代结束时无条件执行的 RxJs 运算符
问题描述
是否有一个 Rx 运算符或组合来保证每个可观察到的发射最后一些逻辑执行?
让我们假设以下上下文:
- 无休止的或连续的序列
- 条件逻辑喜欢
filter()
跳过一些排放 doAlways()
在类似运算符中的每次迭代结束时的一些逻辑
请参考下面代码示例中的编号注释
笔记:
finalize()
将要求序列终止(违反第 1 页)iif()
或常规if
内部switchMap()
是一种选择,但会使代码更不可读
代码片段来说明:步骤 (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));
解决方案
不,您的要求是不可能的,因为过滤后的通知永远不会被传递。您将需要一种全新类型的通知,除了您描述的操作员之外,任何其他操作员都不会使用这种通知。
现在,这是一个可能不被推荐的想法。您可以滥用error
通知来跳过某些运算符,但这会干扰任何其他错误处理,因此您不应该这样做......
const sub = interval(1000).pipe(
tap(a => console.log('starting', a)),
mergeMap(b => b % 100 === 0 ? of(b) : throwError(b)),
switchMap(c => dataService.update(c)),
catchError(b => of(b)),
tap(d => console.log('finishing', d))
)
请注意,我们不使用,而是根据条件filter
映射到 anext
或通知。大多数error
运算符自然会忽略错误并由,或消耗。这是一种在物品上贴标签的方法,以便工人知道他们不应该触摸它(在 Ingo 描述的类比中)tap
subscribe
catchError
推荐阅读
- python - 将 Flash 消息类别添加到 @login_required 重定向
- keras - keras中的“有目的的”不平衡数据和class_weight
- javascript - 使用html上传要下载的批处理文件
- java - 如何正确地在游戏板上制作鼠标监听器以放置国际象棋
- java - Map myMap = new HashMap 和 HashMap myMap = new HashMap 有什么区别?
- css - CSS 溢出:可见(悬停时)移动按钮以匹配文本
- tensorflow-federated - 如何实现具有不同大小客户端子集的多层架构?
- python - 参数应该是整数或无,而不是'_io.TextIOWrapper'
- ocr - Tesseract 两张相似的图片,一张有效,另一张无效,为什么?
- react-native - 运行 React Native 应用程序时如何获取计算机的 IP 地址?