我很难摸索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 模拟,因为它在"解决"(即完成)之前什么都不产生,之后总是将价值提供给任何订阅者。