场景:
Todo:
我已经这样编程了,
尽管我知道由于双重订阅而导致它不正确:
this.B = [];
this.services.firstService().subscribe(
elements => {
elements.forEach (element => {
this.services.secondService(element).subscribe(s => {
this.B.push(s);
})
});
});
哪些运营商或运营商组合可以改善上述情况?
答案 0 :(得分:1)
通常可以使用operators
解决订阅中的订阅。您可能正在寻找的是mergeMap
运算符,该运算符从所谓的 outer observable (在您的情况下为this.services.firstService()
)中提取发射的项,并将其映射到新的内部可观察,在您的情况下为this.services.secondService(element)
。
现在,在您的特定情况下,由于elements
是列表,每次发射外部可观察物都会创建多个内部可观察物。您可以使用多种方法来处理此问题,但我建议使用zip
运算符。它将Observable<B>[]
转换为Observable<B[]>
,这正是您想要的。
您的示例可以这样解决:
import {zip, Observable} from 'rxjs';
import {mergeMap} from 'rxjs/operators';
this.services.firstService().pipe(
mergeMap(elements =>
<Observable<B[]>> zip(...elements.map(element =>
this.services.secondService(element)))
))
.subscribe(elements => {
this.B = elements;
});
有关二手运营商的更多信息,请参见:
zip
http://reactivex.io/documentation/operators/zip.html
mergeMap
http://reactivex.io/documentation/operators/flatmap.html