如何知道是否switchMap退订内可观察?

问题描述 投票:1回答:1

因为如果一个新项目进来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项被取消的方法吗?是的原因,如果取消正在发生过于频繁,我想知道。

我试着修改内观测量的方式,但基本上什么我尝试“末”的他们根本不退订的时候发生的事情。观察员规格有nextcompletederror,但没有为“提前结束”,所以我不知道去尝试什么。

我想能够通过附加的功能以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 observable rxjs6 reactivex switchmap
1个回答
1
投票

编辑:有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运营商。

© www.soinside.com 2019 - 2024. All rights reserved.