我很难理解 RxJ 的一个特定部分:当你订阅一个 Observable 时,你只是订阅了任何一个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 提供这两种行为(以及其他行为)。
The 不同的接收主题 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.mdavailable 可以让您探索 observables 的不同行为方式:
the Rx.Subject
是最基本的即发即忘类型——如果事件发生时您没有订阅,那么您就看不到它。
Use new Rx.BehaviorSubject(undefined)
代替Subject
你得到了你正在寻找的行为,因为BehaviorSubject
代表“可以改变的值”
Use new Rx.ReplaySubject(5)
订阅后您将立即获得 5 个最新值
Use new Rx.AsyncSubject()
在可观察到的情况之前你将一无所获完成此时您将获得最终值(如果您再次订阅,则继续获得最终值)。这是 Promises 的真正 Rx 模拟,因为它在“解决”(即完成)之前不会产生任何结果,并且之后总是将值提供给订阅的任何人。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)