gpt4 book ai didi

javascript - Rx BehaviorSubject + 扫描将先前的事件推送给新订阅者?

转载 作者:行者123 更新时间:2023-11-29 10:37:44 26 4
gpt4 key购买 nike

我想要一个流,我可以将 reducer 函数推送到其中。每次推送 reducer 函数时,应将状态对象传递给 reducer,reducer 应返回修改后的状态值,并将更新后的状态推送给订阅者。我希望我的代码可以解释:

import Rx from 'rx';
import { Map } from 'immutable';

let initialState = Map({ counter: 0 });

export let upstream = new Rx.BehaviorSubject(Rx.helpers.identity);
export let downstream = upstream.scan((state, reducer) => {
return reducer(state);
}, initialState);

let increment = state => {
return state.update('counter', counter => counter + 1);
};

upstream.onNext(increment);

downstream.subscribe(state => {
console.log('subscriptionA', state.get('counter'));
});

upstream.onNext(increment);

setTimeout(() => {
downstream.subscribe(state => {
console.log('subscriptionB', state.get('counter'));
});
}, 3000);

这是我看到的输出:

subscriptionA 1
subscriptionA 2
subscriptionB 1

虽然我希望看到:

subscriptionA 1
subscriptionA 2
subscriptionB 2

显然我在这里遗漏了一些基本的东西。似乎 BehaviorSubject 应该为新订阅者保留最新值,这让我觉得当 subscriptionB 订阅 downstream 时,它会得到最新的减少值,但它看起来像在中间有 .scan 弄脏了东西......或者其他东西。

这里发生了什么以及我如何完成我想要完成的事情?谢谢!

最佳答案

你换了试试看是否一切都符合你的预期

export let downstream = upstream.scan((state, reducer) => {
return reducer(state);
}, initialState);

export let downstream = upstream.scan((state, reducer) => {
return reducer(state);
}, initialState).shareReplay(1);

jsfiddle 在这里:http://jsfiddle.net/cqaumutp/

如果是这样,您是 Rx.Observable 冷热特性的另一个受害者,或者更准确地说,是可观察对象的惰性实例化。

简而言之(不是那么短),每次您执行 subscribe 时会发生的事情是,通过向上游操作符链创建可观察链。每个运算符都订阅其源,并返回另一个可观察到的起始源。在您的情况下,当您订阅 scan 时,scan 订阅最后一个 upstreamupstream 是一个主题,在订阅时它只是注册订阅者。其他来源会做其他事情(比如在 DOM 节点、套接字或其他任何地方注册一个监听器)。

这里的要点是,每次你订阅scan,你都会重新开始,即从initialState开始。如果要使用第一次订阅 scan 的值,则必须使用 share 运算符。在第一次订阅 share 时,它会将您的订阅请求传递给 scan。在第二个和后续的上,它不会,它会注册它,并将来自 scan 首先订阅的所有值转发给关联的观察者。

关于javascript - Rx BehaviorSubject + 扫描将先前的事件推送给新订阅者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34114347/

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