因为如果一个新项目进来switchMap
可以切断(退订)内可观察,我们预计如下:
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项被取消的方法吗?是的原因,如果取消正在发生过于频繁,我想知道。
我试着修改内观测量的方式,但基本上什么我尝试“末”的他们根本不退订的时候发生的事情。观察员规格有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.`))
)
编辑:有RxJS GitHub的页面上讨论这一功能为finalize
运营商的问题。 https://github.com/ReactiveX/rxjs/issues/2823
由于switchMap
退订内可观测它不会收到任何完成通知。
相反,你可以再补充一个dispose处理或简单地说,这是否对你使用finalize()
运营商和链配置时,它的调用。这是两个完全和退订事件。
switchMap(item =>
concat(
of(`now: ${item}`),
of(`end: ${item}`).pipe(delay(10))
).pipe(
finalize(() => /* switchMap unsubscribed or concat completed */),
)
)
请注意,当您取消就意味着你不想被接收从可观察到的任何更多的项目。这意味着,退订,当你不能从取消订阅可观测收到任何新项目。还有当资源没有任何发射其适用于完整的通知,但不能工作,你只是退订完成发射的项目例如defaultIfEmpty
运营商。