【发布时间】:2019-01-11 15:39:38
【问题描述】:
由于switchMap 可能会在有新项目进入时切断(取消订阅)内部 Observable,因此我们预计会出现以下情况:
const items = from([1, 2])
const seen = []
const derived = items.pipe(
switchMap(item =>
concat(
of(`now: ${item}`),
of(`end: ${item}`).pipe(delay(10))
)
)
)
derived.subscribe(next => seen.push(next))
导致seen 拥有:
['now: 1', 'now: 2', 'end: 2']
^ unsubscribed to 1 here, as planned!
问题是,有没有办法在第 1 项被取消时收到通知?原因是,如果取消太频繁,我想知道。
我已经尝试过修改内部 Observables 的方法,但基本上我尝试在它们“最后”做的任何事情在取消订阅时都不会发生。观察者规范有 next、completed 和 error,但没有“提前结束”,所以我不知道该尝试什么。
我希望能够向 switchMap 传递一个附加函数,当内部可观察对象被取消并提供参数时,该函数将由操作员调用。
const derived = items.pipe(
switchMap(item => concat(
of(`now: ${item}`),
of(`end: ${item}`).pipe(delay(10))
),
(item) => console.error(`${item} was cut off.`))
)
【问题讨论】:
-
我刚刚意识到这里讨论了这个问题:github.com/ReactiveX/rxjs/issues/2823。这是一个自定义运算符,可以告诉您为什么要处置链:stackblitz.com/edit/rxjs-scmt4v?file=index.ts
标签: rxjs observable rxjs6 reactivex switchmap