我正在努力理解如何合并两个可观察对象并利用它们合并后的产品。我在mergeMap、switchMap、flatMap、大理石图等上看了无数视频,但我仍然不知道合并观测值是如何工作的。我觉得在使用RxJS的时候,我不会有效率,甚至不会正确。
我有一个要订阅的可观测值,我还想订阅代码中特定表单数组的valueChanges可观测值。但是,我需要确保只有在正确构建表单数组之后才能进行第二次订阅,否则将出现null错误。
显然,这样做的一个方法是在我第一次订阅的下一个函数中订阅valueChanges,但是这是一个糟糕的做法,我想避免它。但是,我不确定应该以何种方式构造代码,以便在不使用嵌套订阅的情况下获得所需的行为。
setSettings$(serial: string) {
return this.getSettingsFromSerial$(serial).pipe(
tap(val => {
this.settingsState.savedSettingsState = val;
this.settingsState.ipRestrictionEnabled = val.ipRestrictionSettings.ipRestrictionEnabled;
if(val.ipRestrictionSettings.ipRanges.length === 0){
this.addEmptyRange();
}
else
{
for (const i of val.ipRestrictionSettings.ipRanges) {
this.addRange(i.startRange, i.endRange, i.label);
}
}
this.settingsState.displaySettings = true;
this.settingsState.displayForm = true;
this.hideRangeErrorsUntilNotPristine(); <-- I need to merge (?) this with my first observable to ensure that it happens after the form is built.
})
);
}
// TODO :: Cancel this on destroy
hideRangeErrorsUntilNotPristine(){
this.ipRangeFormArray.valueChanges.subscribe( res => {
let formGroups = this.ipRangeFormArray.controls;
for(let i = 0; i < formGroups.length; i++){
if(formGroups[i].pristine === true) {
this.settingsState.ipRangeValidStates[i].displayError = false;
}
else {
this.settingsState.ipRangeValidStates[i].displayError = true;
}
}
});
}
据我所知,您所需要做的就是确保在TypeScript代码中实例化FormControl
对象后调用此方法。我选择了mergeMap
,没有什么特别的原因,因为如果外部可观测对象多次发射,您只需要考虑使用哪个操作符。
setSettings$(serial: string) {
return this.getSettingsFromSerial$(serial).pipe(
tap(val => {
this.settingsState.savedSettingsState = val;
this.settingsState.ipRestrictionEnabled = val.ipRestrictionSettings.ipRestrictionEnabled;
if(val.ipRestrictionSettings.ipRanges.length === 0){
this.addEmptyRange();
}
else
{
for (const i of val.ipRestrictionSettings.ipRanges) {
this.addRange(i.startRange, i.endRange, i.label);
}
}
this.settingsState.displaySettings = true;
this.settingsState.displayForm = true;
}),
// this gets called once everything in the `tap` has finished,
// because everything is synchronous
mergeMap(() => this.hideRangeErrorsUntilNotPristine())
);
}
我面临的问题是我需要一个身份验证令牌来创建我的Retrofit服务。我目前使用可观察来获取所述令牌,导致一个相当丑陋的可观察构造: 我忍不住觉得这不是应该做的。我说得对吗?
Observables 是多个值的惰性推送集合。它填补了下面表格中的空白: 单个值 多个值 拉取 Function Iterator 推送 Promise Observable 示例 - 当订阅下面代码中的 Observable 的时候会立即(同步地)推送值1、2、3,然后1秒后会推送值4,再然后是完成流: var observable = Rx.Observable.create(functio
我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块
问题:我有一个功能,用户可以输入一个查询字符串,我创建了两个可观察对象,一个用于查询本地DB,另一个用于从API获取结果。这两个操作必须并行运行。我需要尽快显示DB中的结果,当API结果返回时,我需要进行检查以删除本地结果中的重复项。 我的方法:CombineTest似乎是最接近我需要的东西。但问题是,只有当两个可见光都发出结果时,它才会发出。我想我要找的是CombineLatest和Concat
上下文正在使用Couchbase在2级文档存储上实现REST CRUD服务。数据模型是指向零个或多个项目文档的索引文档。使用异步get将索引文档检索为可观察的。这后面是一个为每个项目文档检索零个或多个ID的。异步get返回一个可观察的,所以现在我正在创建的可观察的是可观察的 编辑: 你可能已经猜到我是一个被动的新手。@akarnokd的答案让我意识到我想做的是愚蠢的。解决方案是合并项目