RxJS在外部条件下从流中提取数据

时间:2017-09-20 07:03:16

标签: javascript rxjs rxjs5

上下文:我有一个应用程序的日志库,我想使用Rx Subject将日志写入数据库。 问题:在建立与数据库的连接之前生成日志,并且连接在任何时候都可能变得不可用,但是我有并且可观察到包含具有使用数据库的方法的对象或未定义的对象。我想要做的是在数据库持久性未定义时将日志保留在流中,并在可用时恢复。

我认为代码应该是这样的:

logsSubject
           .takeWhen(/* test for database persistence */) // made up name because I don't know a Rx method that does what I want
           .subscribe(/* write data to database */);

我不确定这是否真的可能因为我一直在使用RxJS很短的时间

3 个答案:

答案 0 :(得分:1)

以下代码是模拟您的方案。数据库将每隔10秒连接一次,并在连接后每隔5秒断开连接。在实际使用案例中,connect和disconnect应该是共享的Observable或Subject。而不是takeUntil运算符我在这里使用了一个合并,因为takeUntil只会完成可观察的序列而你无法恢复它。 (repeatWhen运算符应该工作,但在Rxjs 5中似乎缺失)

([a-zA-z]{1}[a-zA-z_'-,.]{0,23}[a-zA-Z]{0,1})

答案 1 :(得分:0)

你可以反过来做到这一点:

Observable.combineLatest(dbConnection, logsSubject, (db, logs) => {
    // whatever: db.save(...)
  })
  .do(/* or since it's a side effect it should probably go here instead */)

这样combineLatest将等到两个源Observable都发出并保持dbConnection,即使它只发出一个项目。

答案 2 :(得分:0)

我需要的是从RxJS4获取的pausable,但由于它已在RxJS5中删除,我最终得到了以下解决方案:

let dbAvailability = dbSubject
         .switchMap((db) => db ? logSubject : Rx.Observable.never());

//get data only when dbAvailability emits, and that happens only when I have a connection
let bufferedLogs = logSubject.buffer(dbAvailability);

bufferedLogs
  .concatAll()
  .subscribe(/* save to database */);