仅在一组事件之后发出?

zli*_*liz 1 rxjs

我正在尝试做类似以下的事情 - B 独立于 A 发出,但我想在 A 之后发生 B 时发出(按该顺序)。

----A--------A-->
B--B--B--B----B->

------B-------B->
Run Code Online (Sandbox Code Playgroud)

谢谢!

ols*_*lsn 5

如果您有一个热可观察对象并且想要从 发出值,那么您可能需要将a 与 : 结合B使用(基本上只有最后 3 行是相关的,上面的部分只是模拟一些数据流)switchMaptake(1)

// Mocking A and B
const streamA$ = Rx.Observable
  .interval(2500)
  .do(() => console.log("Emitting on A => TAKE NEXT B!!!"))
  .share();
const streamB$ = Rx.Observable
  .interval(1200)
  .do(data => console.log("Emitting on B: " + data))
  .publish();
streamB$.connect();
// \End of mocking

streamA$
  .switchMap(() => streamB$.take(1))
  .subscribe(data => console.info("Took value: " + data));
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


如果您有冷可观察量,您可以window结合使用map

// Mocking A and B
const streamA$ = Rx.Observable
  .interval(4000)
  .do(() => console.log("Emitting on A => TAKE NEXT B!!!"));
const streamB$ = Rx.Observable
  .interval(900)
  .do(data => console.log("Emitting on B: " + data));
// \End of mocking

streamB$.window(streamA$)
  .skip(1)                 // skip the first window, since this will be emitted before A emitted the first time
  .mergeMap(win => win.take(1)) // each window should have at most 1 emission
  
  .subscribe(data => console.info("Took value: " + data));
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
Run Code Online (Sandbox Code Playgroud)