如何发出 1 后没有紧跟 2

How to emit 1's not closely followed by a 2

我有一个发出数字的可观察流,我想要另一个发出所有 1 的流,这些 1 后面没有紧跟一个 2(比如 200 毫秒内),例如来自这个源流:

(每个字符为100ms)

1...12...112...11121...

结果应该是:

..1.......1.....11...1.

我如何使用 rxjs@^6.6.7 来做到这一点?

我会这样做。每个 1 都被一个内部 Observable 包裹并延迟 200 毫秒,这可能会更早地使用 takeUntil() 完成并因此被忽略:

source$
  .pipe(
    filter(value => value === 1),
    mergeMap(value => of(value).pipe(
      delay(200),
      takeUntil(source$.pipe(
        filter(value => value === 2),
      )),
    )),
  )

基于@martin 的回答:

当发出 1 时,

  • 我们创建了一个等待下一个元素 200 毫秒的新 Observable
  • 如果在 200 毫秒内没有元素出现,我们将发出 1 并关闭订阅
  • 如果出现一个元素并且它是 2,我们什么都不发出并关闭订阅
  • 如果出现一个元素并且它是 1,我们发出原始值并关闭订阅

https://stackblitz.com/edit/rxjs-ihyznt?devtoolsheight=66&file=index.ts

source
  .pipe(
    filter(value => value != 2),
    mergeMap(value =>
      source.pipe(
        first(),
        filter(v => v != 2),
        map(_ => value),
        timeout(200),
        catchError(_ => of(value))
      )
    )
  )
  .subscribe(value => console.log(value));