gpt4 book ai didi

javascript - 让任何 Observable 表现得像 ReplaySubject

转载 作者:行者123 更新时间:2023-11-29 16:03:51 24 4
gpt4 key购买 nike

我一直在尝试让我的流仅重播最新的值,但运气不佳。基本上,我有一个 replaySubject(1) 在我不能手动 .onNext 的地方。我想做的是接受它,将它映射到其他东西,然后添加一个初始值。

我的第一直觉是:

var testInStream = new Rx.ReplaySubject(1);
var testOutStream = testInStream.startWith(-1);

testInStream.onNext(0);

setTimeout(function(){
testOutStream.subscribe(function(x){
console.log("stream:", x);
});
}, 1000);

哪个打印

stream: test -1
stream: test 0

但是,我想找到一种方法只打印stream: test 0。我能想到的最接近的事情是

var testInStream = new Rx.ReplaySubject(1);
var testOutStream = testInStream.startWith(-1);

testInStream.onNext(0);

var wrapperSubject = new Rx.ReplaySubject(1);
testOutStream.subscribe(function(new_val){ wrapperSubject.onNext(new_val) });

setTimeout(function(){
wrapperSubject.subscribe(function(x){
console.log("stream:", x);
});
}, 1000);

哪个返回

stream: test 0

这就是我想要的。但是,我宁愿不创建中间 replaySubject,我宁愿只调用类似 testOutStream.latest()testOutStream.replay(1) 但我还没有让他们中的任何一个工作。

感谢任何帮助,这里是JS Bin用我的例子。

最佳答案

您可以使用shareReplay(1),示例代码为here

var validation$ = Rx.Observable
.fromEvent(document.getElementById('validation'), 'click')
.map(function(_, index){
return ++counter;
})
.do(emits(ta_validation, 'index'))
.shareReplay(1)

validation$.subscribe(function(){})

setTimeout(function() {
validation$
.do(emits(ta_result, 'second subscription'))
.subscribe(function(){ });}, 3000)

我天真地尝试了 replay(1)connect 但奇怪的是整个流值都被重播了。所以最好是使用 shareReplay

另请记住,根据您要对“最新”值执行的操作,可以使用以下运算符:

关于javascript - 让任何 Observable 表现得像 ReplaySubject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36271229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com