【问题标题】:Publish the last value of an observable发布 observable 的最后一个值
【发布时间】:2012-03-16 10:40:21
【问题描述】:

我有一个热门的 observable(在这种情况下是一个主题):

var subject = new Rx.Subject();

我想创建另一个可观察对象,每次进行新订阅时都会立即触发生成的最后一个值。

所以在伪代码中:

var myObservableWithLastValue = subject.publishLast();

subject.onNext(3);

myObservableWithLastValue.subscribe(function(x){
    console.log(x); //should write 3
});

myObservableWithLastValue.subscribe(function(x){
    console.log(x); //should write 3, too
});

subject.onNext(4);

myObservableWithLastValue.subscribe(function(x){
    console.log(x); //should write 4
});

这大致是我想要的,它似乎工作。但是,我想必须有一些内置机制来实现相同的效果

Rx.Observable.prototype.keepLatest = function () {
    var latestValue;

    var disposable = this.subscribe(function (value) {
        latestValue = value;
    });

    return Rx.Observable.create(function (observer) {
        observer.onNext(latestValue);
        return disposable.dispose;
    });
};

【问题讨论】:

    标签: rxjs reactive-extensions-js


    【解决方案1】:

    RxJs 现在有 ReplaySubject。使用 1 个缓冲区对其进行初始化,然后您就拥有了 BehaviorSubject。

    // as an example, use buffer size of 2
    var subject = new Rx.ReplaySubject(2 /* buffer size */);
    
    subject.onNext('a');
    subject.onNext('b');
    subject.onNext('c');
    
    subject.subscribe(function (x) { document.write('x1:' + x + '<br>'); });
    
    subject.onNext('d');
    
    subject.subscribe(function (x) { document.write('x2:' + x + '<br>'); });
    &lt;script src='https://rawgit.com/Reactive-Extensions/RxJS/v.2.5.3/dist/rx.all.js'&gt;&lt;/script&gt;

    【讨论】:

    • @gajus-kuizinas 你能告诉我你的代码和原始代码之间的主要区别是什么吗?恐怕我错过了什么。此外,它将缓冲区大小设置为 2,因此每次都会重播最后 2 个值。
    • 无。我只是使示例具有交互性和完整性。缓冲区大小用于演示与在 @Asti 答案中使用 BehaviorSubject 的区别。这就是为什么我没有创建一个新的 asnwer,而只是为你的。
    • @GajusKuizinas 好的。我明白你的意思了。改进了一点,以在结果窗口而不是控制台中显示结果:)
    • 你真的不应该为此目的使用document.write。 console.log 允许检查输出并与之交互。不过,这是基于意见的建议。
    • @GajusKuizinas 使用 console.log,您在结果窗口中看不到任何内容。你有更好的建议吗? console.log 还可以,但交互性不太强
    【解决方案2】:

    BehaviorSubject:

    初始化Rx.BehaviorSubject 类的新实例,该实例创建一个缓存其最后一个值并以指定值开始的主题。

    var subject = new Rx.BehaviorSubject('a' /* initial value */);
    
    subject.subscribe(function (x) {
        console.log('x1:' + x);
    });
    
    subject.onNext('d');
    
    // Will produce the last value.
    
    subject.subscribe(function (x) {
        console.log('x2:' + x);
    });
    &lt;script src='https://rawgit.com/Reactive-Extensions/RxJS/v.2.5.3/dist/rx.all.js'&gt;&lt;/script&gt;

    【讨论】:

    • 好的,但是没有内置的运算符可以接受现有的流并应用草图的行为吗?
    • @Christoph 您是否尝试过将普通主题换成 BehaviorSubject?
    • 我不直接处理主题。这只是为了更好地说明行为。我想要一个适用于任何热无限流的运算符。
    • 主题实现了 IObserver 和 IObservable。您应该能够让行为主体订阅您的 IObservable,然后依次订阅 BehaviorSubject
    【解决方案3】:

    我在热门的Observable 上使用了.cache(1)。似乎给出了你要求的行为(但我是新手)。

    可以观察到,每次进行新订阅时都会立即触发生成的最后一个值。

    【讨论】:

    • 仅供参考,我的理解是 cache 在即将发布的版本中一直是 removed。
    猜你喜欢
    • 2023-02-25
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2021-11-25
    相关资源
    最近更新 更多