如何使一个可观察对象依赖于另一个可观察对象

6

我在构建依赖于相同基础源的2个可观察对象时,遇到了一个理解事件顺序的问题。我希望您不仅可以帮我找到可行的解决方案,还能解释为什么会产生下面的结果。我的目标是observable2observable1之前永远不会发出。

代码

const filters$ = new Subject();

const observable1 = filters$.pipe(
  map(() => 'obersvable1')
);

const observable2 = observable1.pipe(
  map(() => 'observable2')
)

observable2.subscribe((v) => console.log(v));
observable1.subscribe((v) => console.log(v));

预期结果
observable1
observable2

实际结果

observable2
observable1

问题在于当filters$主题发出时,observable2首先发出信号?‍♂️
我尝试在observable2上使用mergeMap操作符,使它"依赖于" observable1--> 但是没有任何帮助。
复现: 这里提供一个带有TypeScript和RxJS的链接

基于什么逻辑observable2应该先接收事件?你可以切换订阅的顺序。 - martin
1
我只想确保observable2始终在observable1之后发出 - 就这样。 - DauleDK
1
在这种情况下,请使用concatMap - bubbles
1
不错的问题,有一个很好的答案。 - Jonathan Stellwag
1个回答

4

在将observable1传递给observable2之前,您可以使其发出的内容变成异步的:

const observable2 = observable1.pipe(
  observeOn(asyncScheduler),
  map(() => 'observable2')
);

你的更新后的演示:https://stackblitz.com/edit/rxjs-xqcyqk?file=index.ts


哇 - 它真的起作用了。observeOn(asyncScheduler) 在这里实现了什么? - DauleDK
1
我认为这个解决方案并不总是可行!根据asyncScheduler的文档:_调度任务,就好像你使用了setTimeout(task, duration)_。因此,observeOn将把map(任务)放入调用堆栈中,并等待执行。这仍然是异步的,因为如果调用堆栈包含许多要执行的任务,则第二个observable可能会先于第一个observable执行。 - bubbles
@bubbles 队列中有多少任务并不重要。只要 observable1 保持同步,那么使用 observeOnobservable2 将始终在 observable1 之后接收事件。 - martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接