1

这是场景:

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

我正在使用 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>

4

1 回答 1

2

超时时间为 399,您在b发出之前订阅,因此您可以看到它的值。超时时间为 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>

于 2018-01-23T18:14:33.790 回答