【问题标题】:RxJS handle multiple database connectionsRxJS 处理多个数据库连接
【发布时间】:2018-01-23 17:29:37
【问题描述】:

这是场景:

我有多个连接到不同的数据库,我想确保代码在所有连接都处于活动状态时运行。

我正在使用 Rxjs 来处理这个问题(欢迎使用另一种解决方案),但我面临这样的问题,如果我在其中一个事件处于活动状态之后组合连接事件,我永远不会运行订阅,因为 combineLatest 希望发出所有可观察对象,但它们是!

const a = new Rx.Subject();
const b = new Rx.Subject();

var bool = false;

setInterval(()=>{
    bool = !bool
    a.next(bool ? ' i am connected' : 'im NOT connected');
},1000)

setTimeout(()=>{
    b.next('i am always connected!')
},400)

// this variable will be exported to all js that run queries
var obs = new Rx.Observable.combineLatest(a,b);

setTimeout(()=>{
    obs.subscribe((andb)=>{
        console.log( andb )
        // i can check all connections at once and run the code
    })
},399)

// problem is here, i want to subscribe later than the connections 
//emit, if you edit 399 to 401 you will see that nothing is going on 
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.js"></script>

【问题讨论】:

    标签: javascript asynchronous events rxjs emitter


    【解决方案1】:

    您在 b 发出之前订阅了 399 的超时,因此您可以看到它的值。 使用 401 超时,您在 b 发出后订阅,因此您看不到它的值或 a 的值,因为 combineLatest 需要两者。在订阅之前,combineLatest 不会跟踪 ab 的最新值。

    因此,您可以使用不同类型的主题来跟踪最后一个值(BehaviorSubjectReplaySubject)或使用 repeat 运算符。

    这是一个ReplaySubject(1) 的示例(与 BehaviorSubject 基本相同,但不需要初始值)并在 401 订阅:

    const a = new Rx.Subject();
    const b = new Rx.ReplaySubject(1);
    
    var bool = false;
    
    setInterval(()=>{
        bool = !bool
        a.next(bool ? ' i am connected' : 'im NOT connected');
    },1000)
    
    setTimeout(()=>{
        b.next('i am always connected!')
    },400)
    
    // this variable will be exported to all js that run queries
    var obs = new Rx.Observable.combineLatest(a,b);
    
    setTimeout(()=>{
        obs.subscribe((andb)=>{
            console.log( andb )
            // i can check all connections at once and run the code
        })
    },401)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.js"></script>

    【讨论】:

    • 感谢您的回复,我在 rxjs 5 中找不到这些类型的主题,最新版本的最佳方法是什么?
    • @ÆndriDomi 这些主题存在于最新版本的 rxjs 中。我会将您的示例与 rxjs 5 添加到我的答案中。
    • 你是对的!你能解释一下科目之间的区别吗?
    • @ÆndriDomi 如果您的原始问题已得到解答,最好单独提出一个问题。这样,这个问题就可以对其他人有用。自己做一些研究,如果你无法弄清楚,提出一个新问题,显示你尝试过的代码。
    • @ÆndriDomi 是的,您可能不希望 ReplaySubject 没有缓冲区大小,否则它将重播所有消息。我将示例更新为缓冲区大小为 1。ReplaySubject(1) 实际上与 BehaviorSubject 相同,只是 BehaviorSubject 需要一个初始值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    相关资源
    最近更新 更多