【问题标题】:How do I make an observable depend on another observable我如何使一个可观察对象依赖于另一个可观察对象
【发布时间】:2020-01-25 13:11:09
【问题描述】:

在构建 2 个依赖于同一底层源的可观察对象时,我无法理解事件的顺序。我希望您不仅可以帮助我找到可行的解决方案,还可以解释为什么我会在下面得到结果。我的目标是 observable2 永远不会在 observable1 之前发出。

代码

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 --> 但根本没有帮助。

复制

这是一个link 与 typescript 和 rxjs 的堆栈闪电战。

【问题讨论】:

  • 基于什么逻辑observable2应该先接收事件?您可以切换订阅顺序。
  • 我只是想保证observable2 总是在observable1 之后发出 - 就是这样。
  • 在这种情况下使用concatMap
  • 好问题,答案很好。

标签: javascript typescript rxjs


【解决方案1】:

您可以在将observable1 的排放量传递给observable2 之前使它们异步:

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

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

【讨论】:

  • 哇——它确实有效。 observeOn(asyncScheduler) 在这里完成了什么?
  • 我认为这个解决方案不会一直有效!来自asyncScheduler 的文档:像使用 setTimeout(task, duration) 一样安排任务。因此,observeOn 会将地图(任务)放入调用堆栈并等待轮到它执行。这将保持异步,因为如果调用堆栈包含许多要执行的任务,则第二个 observable 可能在第一个之前
  • @bubbles 队列中有多少任务并不重要。只要observable1 保持同步,那么observable2observeOn 将始终在observable1 之后接收事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2019-02-18
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多