如何正确使用Observable数据,用其他Observable修改这些数据并将其作为Observable返回

时间:2017-06-12 11:57:14

标签: angular rxjs

我有angular2项目,其中有这个类:

class Application {
    id: number;
    last_android_releasse_url: string;
    last_android_releasse: Release;
    last_ios_releasse_url: string;
    last_ios_releasse: Release;
}

我获取所有应用程序并使用|加载它们异步管道这样:

this.asyncApps = this.appService.getAll(this.params)
      .do((data: any) => {
        this.count = data.count;
      }).map(data => {
        return data.apps;
      });

我需要的是为data.apps中的每个应用程序加载每个发布对象,并为asyncApps返回observable以使用异步管道。我不知道如何提出我的问题所以我接受了改变标题的提议。 所以最终的代码应该是这样的:

this.asyncApps = this.appService.getAll(this.params)
      .do((data: any) => {
        this.count = data.count;
      }).map(data => {
        for (let app of data.apps) {
          this.http.get(app.last_android_releasse_url).subscribe(
            release_data => {
              app.last_android_releasse = release_data.json().last_android_releasse;
            },
            error => this.alertService.showError(error.etext)
          );
          this.http.get(app.last_ios_releasse_url).subscribe(
            release_data => {
              app.last_ios_releasse = release_data.json().last_ios_releasse;
            },
            error => this.alertService.showError(error.etext)
          );
        }
        return data.apps;
      });

这个可行,但我正在考虑使用flatMap或forkJoin。对我来说似乎不是正确的解决方案。你能帮我清楚吗?

1 个答案:

答案 0 :(得分:1)

你是对的,你可以使用flatMap。谢谢你的提问,这就是我的尝试。

this.asyncApps = this.appService.getAll(this.params)
      .do((data: any) => {
        this.count = data.count;
      })
      .flatMap(data => Observable.from(data.apps))
      .flatMap(app => Observable.forkJoin(
            this.http.get(app.last_android_releasse_url).map(d => d.json().last_android_releasse),
            this.http.get(app.last_ios_releasse_url).map(d=>d.json().last_ios_releasse))
          .first()
          .map(res => Object.assign(app, {
                  last_android_releasse : res[0],
                  last_ios_releasse : res[1]})
           )
      );

让我知道它的工作原理。

这就是我做的事情

this.asyncApps = this.appService.getAll(this.params)

执行网络电话

          .do((data: any) => {
            this.count = data.count;
          })

将计数更新为结果数

          .flatMap(data => Observable.from(data.apps))

将列表流转换为单个项目流

          .flatMap(app => Observable.forkJoin(

对于每个应用,我正在转换应用,而无需响应带响应数据的应用。由于它的异步并且需要Observable,所以使用了flatMap。

                this.http.get(app.last_android_releasse_url).map(d => d.json().last_android_releasse),
                this.http.get(app.last_ios_releasse_url).map(d=>d.json().last_ios_releasse))

并行执行单独调用并将结果合并到数组流

              .first()

获得第一个结果

              .map(res => Object.assign(app, {
                      last_android_releasse : res[0],
                      last_ios_releasse : res[1]})
               )

将结果转换为带结果的应用

          );

最后,我们应该有一个应用程序流,每个应用程序都有响应。