Angular-rxjs-将可观察数组转换为另一个可观察数组

时间:2018-08-22 07:59:47

标签: angular rxjs observable

场景:

  • 也许这很简单,但是我找不到解决方案。
  • 我有一个服务“ firstService”,它返回A []的Observable。 我有一个传递给对象A并返回Observable的服务“ secondService”。 我最后想要的是对象B []。
  • 对象A与对象B不同。


Todo:

  • 我要避免重复订阅。


我已经这样编程了,
尽管我知道由于双重订阅而导致它不正确:

this.B = [];
this.services.firstService().subscribe(
elements => {
   elements.forEach (element => {
     this.services.secondService(element).subscribe(s => {
       this.B.push(s);
     })
   });
});

哪些运营商或运营商组合可以改善上述情况?

1 个答案:

答案 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