2

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 を変更する方法を試してみましたが、基本的に、それらの「最後に」やろうとすることは、購読を解除すると起こりません。オブザーバーの仕様には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.`))
  )
4

1 に答える 1