首页 > 解决方案 > 在每次迭代结束时无条件执行的 RxJs 运算符

问题描述

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

让我们假设以下上下文:

  1. 无休止的或连续的序列
  2. 条件逻辑喜欢filter()跳过一些排放
  3. doAlways()在类似运算符中的每次迭代结束时的一些逻辑

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

笔记:

代码片段来说明:步骤 (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));

标签: javascriptrxjsobservable

解决方案


不,您的要求是不可能的,因为过滤后的通知永远不会被传递。您将需要一种全新类型的通知,除了您描述的操作员之外,任何其他操作员都不会使用这种通知。

现在,这是一个可能不被推荐的想法。您可以滥用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 描述的类比中)tapsubscribecatchError


推荐阅读