微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何发出 1 后不紧跟 2

如何解决如何发出 1 后不紧跟 2

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

(每个字符100ms)

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

结果应该是:

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

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

解决方法

基于@martin 的回答:

当发出 1 时,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。