使用RXJS驱动';活动';光

使用RXJS驱动';活动';光,rxjs,Rxjs,我有一个“db doing stuff”主题,它为“正在保存”/“不再保存”输出true/false。这是在对象保存的“开始”和“结束”阶段发生时发生的 我想用它来驱动一个显示三种状态的UI符号: 闲散 拯救 完成 我想: “空闲”将在无任何事情发生时显示(默认状态) “正在保存”以立即显示主题输出“true”。只要保存操作正在进行,就应该是这种情况 “完成”将在主体发出“false”(不再保存)后出现,持续1s1s过后,将出现Idle(空闲) 保存/完成保存对象时,我的现有主题输出tr

我有一个“db doing stuff”主题,它为“正在保存”/“不再保存”输出true/false。这是在对象保存的“开始”和“结束”阶段发生时发生的

我想用它来驱动一个显示三种状态的UI符号:

  • 闲散
  • 拯救
  • 完成
我想:

  • “空闲”将在无任何事情发生时显示(默认状态)
  • “正在保存”以立即显示主题输出“true”。只要保存操作正在进行,就应该是这种情况
  • “完成”将在主体发出“false”(不再保存)后出现,持续1s1s过后,将出现Idle(空闲)
保存/完成保存对象时,我的现有主题输出true/false。从它自己的角度来看,这很理想,因为它对UI/反馈一无所知

在RX中,有什么好方法可以做到这一点? 这是否适合Rx


当前正在使用rxjs-5.5

如果您的activity light UI是唯一需要以这种方式解释流的东西,您可以在订阅中处理它:

myDbActivityFunction()
.subscribe((isDbActive: boolean) => {
    if(isDbActive) {
        myUiState = 'Saving';
    }
    else {
        myUiState = 'Done';
        Observable.interval(1000).take(1)            
        .subscribe(x => { myUiState = 'Idle';});
        //you could replace the above two lines with a setTimeout function
    }
});

如果您想继续下一步,更为有效的方法是将数据源(例如数据库状态回调)转换为可观察的流,以您想要的方式发送数据,而不是使用订阅中的逻辑来管理数据。我们需要更多关于您的数据库服务的信息来了解这一点。

谢谢您的帖子。我有一个非常简单的DB包装器,它在保存开始时发出“true”,保存完成时发出“false”,然后发出“true”(暂时忽略错误)。那还不是一条可以观察到的河流吗?e、 g:它会这样做。保存通知。下一步(SavingState.StartedSaving);当我开始思考直接从可见光发射三种状态的想法时,它使用了枚举。然后我在这里问:)这就是:(SchedulerDatabase类),出于兴趣。@NeilClayton我看了一眼。您的方法很好,但解释了为什么使用
.next()
强制推动排放不是惯用的RxJS。理想情况下,您应该包装您的异步调用(例如,
db.get()
)以返回完整的观察值,然后将它们组合/合并到您的UI订阅的聚合流中。这样,您就可以订阅有限的流,而不必担心取消订阅。另外,您的排放不是副作用,而是返回返回给调用组件/UI.Right的值。这很有道理,谢谢你指出这一点。到时候我会有另一个裂缝的。