【问题标题】:Observable of array to array (Rxjs)可观察的数组到数组(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

我怎样才能做到这一点?

【问题讨论】:

    标签: arrays angular typescript rxjs observable


    【解决方案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算子,乐于学习)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多