【发布时间】:2019-07-01 11:08:02
【问题描述】:
我正在尝试创建一种方法来返回可以存储在三个位置之一的设置。我创建了三个可观察对象,每个对象都尝试从源中检索设置值。我希望能够以这样一种方式“加入”这些以创建一个 IF/ELSE IF/ELSE 构造,以便最终只有一个 Observables 发出设置值。从一个 observable 移到下一个 observable 的条件是前一个“失败”,即发出一个未通过条件的值。尝试每个选项的顺序很重要。
所以到目前为止我的方法看起来像这样:
getSetting(settingName: string): Observable<any> {
const optionOne$ = this.getItemAtFirst(settingName).pipe(
take(1),
filter(setting => setting && this.isSettingValid(settingName, setting)));
const optionTwo$ = this.getItemAtSecond().pipe(
take(1),
filter(setting => setting && this.isSettingValid(settingName, setting)));
const optionThree$ = of(this.defaultSettingValue);
return merge(optionOne$, optionTwo$, optionThree$);
}
这显然行不通,因为merge 没有提供我需要的选择效果。
有什么建议吗?提前致谢!
【问题讨论】:
-
为什么将相同的东西存放在三个不同的地方?对于任何想要改变这一点的人来说,这肯定会非常混乱
-
@Liam 我没有详细说明,但这些地方是本地存储或 MongoDB。我需要先在本地检查(IndexedDB),然后如果设置不存在,我尝试 MongoDB,如果不存在,我使用默认值。
-
似乎
forkJoin是要走的路 -
但是我只想在第一个不发射的情况下才去寻找第二个或第三个可观察对象......看起来 forkJoin 不像那样工作 - 看起来它执行了所有涉及的可观察对象。
-
已经提供了答案,但我认为@Liam 的意思是您将删除过滤器,并使用 forkJoin 获取所有值,然后整理它们是否有效它们来自哪个来源?我的回答假设您从中获取值的可观察对象将完成-即使单个未完成,合并也不会触发……这是要考虑的相关内容,但超出了您的要求这里
标签: angular typescript rxjs observable rxjs6