如何在订阅时获取观察者的 "current" 值

How to get the "current" value of an Observer at subscribe-time

我很难理解 RxJs 的一个特定部分:当你订阅一个 Observable 时,你只是订阅了来自该 Stream 的任何 future 事件。与 Promises 相比,如果 Promise 已解决,无论何时调用 then().

,您都会获得该值

这是一个代码示例:

var subject = new Rx.Subject();

subject.onNext('old value');
subject.onNext('before subscription');

subject.subscribe(function(val) {
  document.write(val);
});

subject.onNext('after subscription');
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/2.3.24/rx.all.js"></script>

我希望看到 "before subscription" 和 "after subscription" 都打印出来,尽管对我来说 "old value" 会被丢弃。但似乎 RxJs 不能那样工作(只打印 "after subscription" )。我怎样才能得到我想要的结果?

Rx 提供这两种行为(以及其他行为)。

可用的 different Rx Subjects 可以让您探索可观察对象的不同行为方式:

  • Rx.Subject 是最基本的即发即弃类型——如果您在事件发生时没有订阅,那么您将看不到它。

  • 使用 new Rx.BehaviorSubject(undefined) 而不是 Subject 你会得到你想要的行为,因为 BehaviorSubject 代表 "value that can change"

  • 使用new Rx.ReplaySubject(5),订阅后您将立即获得 5 个最新值

  • 使用new Rx.AsyncSubject(),直到observable 完成,您将一无所获,届时您将获得最终值(并继续获得如果您再次订阅,则为最终值)。这是 Promises 的真正 Rx 模拟,因为它在 "resolves"(即完成)之前不产生任何东西,之后总是将值提供给任何订阅者。