javascript - 如何在订阅时获取观察者的 "current"值

标签 javascript rxjs

我很难理解 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/

相关文章:

javascript - 链接多个可观察对象并重用链中已执行的可观察对象的结果

javascript - 如何更改列表项的innerHTML?

javascript - JS : GetElementsByName from within form

angular - 为什么 rxjs debounceTime 不适用于使用 'of' 运算符创建的可观察量?

angular - Rxjs 结合了 2 个可观察对象,Angular 2

angular - 多个 observable 协同工作

angular - RXJS 获取 ReplaySubject 的当前值

javascript - 计算当前年龄(以月为单位)

javascript - 带有 .catch() 的 promise 被拒绝,但在 Promise.allSetteled 中显示为已完成

javascript - Angular 1 - 在父 Controller 和子 Controller 之间共享数据 - 需要建议