我很难理解 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>
我希望看到“订阅前”和“订阅后”都打印出来,尽管对我来说“旧值”会被删除是有道理的。但似乎 RxJs 不是那样工作的(仅打印“订阅后”)。我怎样才能得到我想要的结果?
最佳答案
Rx 提供这两种行为(以及其他行为)。
different Rx Subjects available 可以让您探索可观察对象的不同行为方式:
Rx.Subject
是最基本的即发即弃类型——如果事件发生时您没有订阅,那么您将看不到它。使用
new Rx.BehaviorSubject(undefined)
而不是Subject
你会得到你正在寻找的行为,因为BehaviorSubject
代表一个“可以改变的值”使用
new Rx.ReplaySubject(5)
,您将在订阅后立即获得 5 个最新值使用
new Rx.AsyncSubject()
并且在可观察的 完成 之前您将一无所获,届时您将获得最终值(并继续获得如果您再次订阅,则为最终值)。这是 Promises 的真正 Rx 类比,因为它在“解决”(即完成)之前不会产生任何东西,并且之后总是将值提供给任何订阅者。
关于javascript - 如何在订阅时获取观察者的 "current"值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28311118/