【问题标题】:Why `BehaviorSubject` doesn't emit the last value为什么`BehaviorSubject`不会发出最后一个值
【发布时间】:2017-09-24 00:56:10
【问题描述】:

documentation on BehaviorSubject 声明无论我何时订阅,它都应该返回最后一个发出的值,但它不会为我返回它:

const ofObservable = Rx.Observable.of(1, 2, 3);
const subject = new Rx.BehaviorSubject();
ofObservable.subscribe(subject);

subject.subscribe((v) => {
    console.log(v);
}, null, () => {
    console.log('completed');
});

代码仅记录completed

ReplaySubject 与上述代码和日志1, 2, 3, completed 一起按预期工作。

【问题讨论】:

    标签: javascript rxjs


    【解决方案1】:

    问题出在其他地方。

    当您使用 ofObservable.subscribe(subject) 时,源 Observable 还会发出 complete 通知,它将 Subject 标记为已停止,并且它永远不会发出任何东西。

    因此,此用例中的解决方案只能传递 next 信号:

    ofObservable.subscribe(val => subject.next(val)); 
    

    查看演示:http://jsbin.com/limurip/3/edit?js,console

    【讨论】:

    • 谢谢,那为什么ReplaySubject 有效呢?它不受源 observable 发出的complete 的影响吗?
    • 用你描述的方法,这个主题永远不会完成,对吧?
    • 显然不是,ReplaySubject 实际上并没有订阅,但它无论如何都会重播所有存储的值。你可以在这里看到它github.com/ReactiveX/rxjs/blob/master/src/ReplaySubject.ts#L41。我认为这是有道理的,因为 ReplaySubject 应该真正重播整个项目序列,而 BehaviorSubject 应该表现得像基本的 Subject 类,但只保证它总是发出至少一个项目。
    • 是的,如果你只传递 next 信号,它就不会完成。
    • 谢谢,但还是有点混乱... ReplaySubject 重播所有内容并完成。我期望 BehaviorSubject 能够类似地工作。但我了解机制以及它们为何不同。我需要对它们进行更多试验。
    猜你喜欢
    • 2019-08-31
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2018-01-20
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多