如何在订阅时获取Observer的"当前"值

Dal*_*onF 48 javascript rxjs

我很难熟悉RxJs的一个特定部分:当你订阅一个Observable时,你只能订阅来自该Stream的任何未来事件.与Promises相比,如果承诺已经解决,无论何时打电话,您都会获得该值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');
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/2.3.24/rx.all.js"></script>
Run Code Online (Sandbox Code Playgroud)

我希望看到"订阅前"和"订阅后"都打印出来,虽然我认为"旧价值"会被取消.但似乎RxJs不会那样工作(仅在"订阅后"打印).我怎样才能得到我追求的结果?

Bra*_*don 82

Rx提供两种行为(以及其他行为).

可用的不同Rx主题可以让您探索可观察者可以表现的不同方式:

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

  • 使用new Rx.BehaviorSubject(undefined)而不是Subject和你得到你正在寻找的行为,因为a BehaviorSubject代表一个"可以改变的价值"

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

  • 使用new Rx.AsyncSubject()并且在observable 完成之前您将得不到任何结果,此时您将获得最终值(如果您再次订阅,则继续获得最终值).这是Promises的真正Rx模拟,因为它在"解析"(即完成)之前不会产生任何结果,之后总是会给订阅的任何人提供价值.

  • "虽然经验丰富的Rx开发人员很少需要直接创建主题" - 你是什么意思,有什么地方我可以得到更多的信息吗? (10认同)
  • @BenGale在开发人员认为需要创建Subject的大多数情况下,开发人员正在重新发明已经存在的现有RxJs方法,无论是包装异步操作的可观察工厂,还是某种异步流操作.不总是.有时,主题正是您所需要的.但是对图书馆不熟悉的开发人员往往会首先看到主题,因为它看起来很熟悉并且最终会遇到困难,因为他们没有意识到他们想要做的事情可能已经实现了. (10认同)
  • @Brandon对Rx一无所知.而且我认为如果你不创造新的主题你会错过很多.创建主题以向应用程序添加异步功能有很多原因,例如组件之间的通信,而您不希望传递组件的状态,甚至更糟糕的是将回调函数从一个组件传递到另一个组件. (3认同)
  • @EchoLogic我指的是[显式构造反模式](http://bluebirdjs.com/docs/anti-patterns.html#the-explicit-construction-anti-pattern).在包装非基于Promise的异步源时,通常只需要显式创建Promises(或Rx Subjects). (2认同)