首页 > 解决方案 > 如何发出不紧跟在 2 后面的 1

问题描述

我有一个发出数字的可观察流,我想要另一个发出所有 1 的流,而不是紧随其后的 2(比如说 200 毫秒内),例如来自这个源流:

(每个字符为 100ms)

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

结果应该是:

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

我将如何使用rxjs@^6.6.7

标签: rxjsrxjs6

解决方案


基于@martin 的回答:

当发出 1 时,

  • 我们创建一个新的 observable 等待下一个元素 200ms
  • 如果 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));

推荐阅读