如何发出 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));
我有一个发出数字的可观察流,我想要另一个发出所有 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));