【发布时间】:2022-01-19 19:18:43
【问题描述】:
我在 Angular 应用程序的上下文中使用 RxJS。
我有一项服务可以根据需要使用不同的设置重新初始化整个应用程序
@Injectable()
class BootstrapService{
public initApplication(config:appConfig):Observable<boolean>{
return somehowCreatedObservable;
};
}
预期用途如下
{
///.... code in part of application that allows user to reinit app
this.bootstrapService.initApplication({someconfig}).subscribe(result=>{
if(result){
//report success
}else report failure
}
}
所以这就像在 http 调用中一样可以冷观察。
现在,我需要向一些相关组件发送额外的通知(例如重建用户菜单、工具栏等 - 以反映从服务器加载的新配置)。
我想通过在BoostrapService#initApplicaiton 内的管道末尾使用主题添加额外的事件发射来做到这一点,就像这样
public initApplication(config:appConfig):Observable<boolean>{
return somehowCreatedObservable().pipe(tap(result=>if(result)this.subject.next(someEvent))
};
然而,这是一个副作用(如果我没记错的话),而函数式编程不应该避免这样的结构,据我了解可以在互联网上找到关于这个主题的内容。
那么问题是,是否可以将此类事件作为副作用发出,还是应该以不同的方式解决?
另一个我想到但仍然不正确的解决方案是让我的操作成为一个“热”的可观察对象,不会返回给调用者,而是使用公共流,例如
appInitResult:Subject<boolean>
public initApplication(config:appConfig):Observable<boolean>{
somehowCreatedObservable().subscribe(r->this.appInitResult.next(r));
return this.appInitResult.asObservable();
};
所以一切都可以订阅完全相同的流,包括方法调用者。
【问题讨论】:
标签: angular typescript rxjs