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



我很难摸索RxJs的一个特定部分:当您订阅可观察对象时,您只会订阅该流中的任何未来事件。与承诺相比,如果承诺已解决,则无论您何时调用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>

我希望看到"订阅前"和"订阅后"都被打印出来,尽管"旧值"会被丢弃对我来说是有道理的。但似乎 RxJs 不是这样工作的(只打印"订阅后")。我怎样才能得到我想要的结果?

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

可用的不同 Rx 主题可让您探索可观察量的不同行为方式:

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

  • 使用new Rx.BehaviorSubject(undefined)而不是Subject,你会得到你想要的行为,因为BehaviorSubject代表一个"可以改变的值"。

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

  • 使用 new Rx.AsyncSubject(),您将一无所获,直到可观察量完成,此时您将获得最终值(如果您再次订阅,请继续获得最终值)。 这是 Promise 的真正 Rx 模拟,因为它在"解决"(即完成)之前什么都不产生,之后总是将价值提供给任何订阅者。

最新更新