如何在订阅时获取观察者的 "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"(即完成)之前不产生任何东西,之后总是将值提供给任何订阅者。
我很难理解 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"(即完成)之前不产生任何东西,之后总是将值提供给任何订阅者。