可观察的数组到数组(Rxjs)

Posted

技术标签:

【中文标题】可观察的数组到数组(Rxjs)【英文标题】:Observable of array to array (Rxjs) 【发布时间】:2018-03-31 18:42:40 【问题描述】:

我有一个服务,它的 getAllMessages() 返回一个可观察的项目数组:Observable<ITEM[]>

我将这样的结果映射到将每个 ITEM 发布到 RestAPI :

this.service.getAllMessages()
.map(items => ...for each item of items, call this.apiService.postMessage(item)...)

postMessage(item) 返回一个Observable<Response>

我的目标是获得一个Observable<Response[]>,我可以通过它检查this.apiService.postMessage(item) 的每个帖子的http 代码

我尝试使用flatMap

this.service.getAllMessages()
  .flatMap(items => 
    return items.map(item => 
      return this.apiService.postMessage(item);
    );
  ).subscribe(RES => 
    console.log(RES);
  );

但这里的 RES 是 Observable<Response> 而不是简单的 Response

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

您的this.service.getAllMessages() 返回的是Observable 的数组,而不是Observable 的数组。 .map()函数属于数组函数。

如果要并行执行所有 Observable,请使用 .forkJoin()

this.service.getAllMessages()
    .flatMap(items => 
        return Observable.forkJoin(items.map(item => this.apiService.postMessage(item)));
    )
    .subscribe(RES => 
        console.log(RES);
    );

如果您想按顺序执行 observable,请使用.concat()

this.service.getAllMessages()
    .flatMap(items => 
        return Observable.concat(...items.map(item => this.apiService.postMessage(item)));
    )
    .subscribe(RES => 
        console.log(RES);
    );

注意.concat 的扩展运算符。

【讨论】:

非常感谢您挽救了我的一天! (不了解spread算子,乐于学习)

以上是关于可观察的数组到数组(Rxjs)的主要内容,如果未能解决你的问题,请参考以下文章

更新可观察打字稿中的数组值

可观察数组的可观察对象?

Angular/RxJS:带有可观察对象的嵌套服务调用

rxjs中常用的操作符

以角度声明对象的可观察数组

Rxjs:将中间订阅和完整的可观察对象合并,并整体完成