合并来自多个 rxjs observables 的结果
combining results from multiple rxjs observables
我有一个自动完成输入,当用户键入时,它会从多个端点获取数据,例如:
//service call to fetch data and return as single observable
getAutocompleteSuggestions() {
const subs$ = [
this.http.get(endpoint1),
this.http.get(endpoint2),
this.http.get(endpoint3)
];
return Observable.forkJoin(...subs$);
}
这些端点中的每一个 returns 形式的数据:
{ data: [], status: xyz }
我想使用 switchmap,因为我只想显示最后一次调用的结果,并尝试了以下方法:
this.getAutocompleteSuggestions(query)
.switchMap(res => {
return res.data;
})
.subscribe((results: any) => {
this.results = results;
});
但是 switchmap 中的 'res' 是一个数组,知道 results 如何包含一个包含来自任意数量的 observable 的响应数据的数组吗?
我用过类似的东西,到目前为止效果很好:
let endpoint1 = this.http.get(endpoint1);
let endpoint2 = this.http.get(endpoint2);
let endpoint3 = this.http.get(endpoint3);
forkJoin([endpoint1, endpoint2, endpoint3])
.subscribe(
results => {
const endpoint1Result = results[0].map(data => data);
const endpoint2Result = results[1].map(data => data);
const endpoint3Result = results[2].map(data => data);
this.results = [...endpoint1Result, ...endpoint2Result, ...endpoint3Result];
},
error => {
console.error(error);
}
);
显然这是一个非常简单的示例,您将能够更好地处理结果以满足您的需要。
我不太明白你想要什么,但我想就是这样:
$filter: Subject<string> = new Subject(); //I guess we have some value to filter by??
向主题推送一个值:
this.$filter.next(myNewValue);
在构造函数或初始化中:
this.$filter
.switchMap(filterValue => { //Get the values when filter changes
subs$ = [
this.http.get(endpoint1 + filterValue),
this.http.get(endpoint2 + filterValue),
this.http.get(endpoint3 + filterValue)
];
return Observable.forkJoin(...subs$);
})
.map(results => { //now map you array which contains the results
let finalResult = [];
results.forEach(result => {
finalResult = finalResult.concat(result.data)
})
return final;
})
.subscribe(); //Do with it what you want
当我们将一个新值放入我们的主题时,整个蒸汽将再次执行。 SwitchMap 将取消所有就绪请求(如果有)。
我有一个自动完成输入,当用户键入时,它会从多个端点获取数据,例如:
//service call to fetch data and return as single observable
getAutocompleteSuggestions() {
const subs$ = [
this.http.get(endpoint1),
this.http.get(endpoint2),
this.http.get(endpoint3)
];
return Observable.forkJoin(...subs$);
}
这些端点中的每一个 returns 形式的数据:
{ data: [], status: xyz }
我想使用 switchmap,因为我只想显示最后一次调用的结果,并尝试了以下方法:
this.getAutocompleteSuggestions(query)
.switchMap(res => {
return res.data;
})
.subscribe((results: any) => {
this.results = results;
});
但是 switchmap 中的 'res' 是一个数组,知道 results 如何包含一个包含来自任意数量的 observable 的响应数据的数组吗?
我用过类似的东西,到目前为止效果很好:
let endpoint1 = this.http.get(endpoint1);
let endpoint2 = this.http.get(endpoint2);
let endpoint3 = this.http.get(endpoint3);
forkJoin([endpoint1, endpoint2, endpoint3])
.subscribe(
results => {
const endpoint1Result = results[0].map(data => data);
const endpoint2Result = results[1].map(data => data);
const endpoint3Result = results[2].map(data => data);
this.results = [...endpoint1Result, ...endpoint2Result, ...endpoint3Result];
},
error => {
console.error(error);
}
);
显然这是一个非常简单的示例,您将能够更好地处理结果以满足您的需要。
我不太明白你想要什么,但我想就是这样:
$filter: Subject<string> = new Subject(); //I guess we have some value to filter by??
向主题推送一个值:
this.$filter.next(myNewValue);
在构造函数或初始化中:
this.$filter
.switchMap(filterValue => { //Get the values when filter changes
subs$ = [
this.http.get(endpoint1 + filterValue),
this.http.get(endpoint2 + filterValue),
this.http.get(endpoint3 + filterValue)
];
return Observable.forkJoin(...subs$);
})
.map(results => { //now map you array which contains the results
let finalResult = [];
results.forEach(result => {
finalResult = finalResult.concat(result.data)
})
return final;
})
.subscribe(); //Do with it what you want
当我们将一个新值放入我们的主题时,整个蒸汽将再次执行。 SwitchMap 将取消所有就绪请求(如果有)。