Angular 2在一系列中执行observable

时间:2016-10-20 07:06:33

标签: angular observable

我有以下方法:

 getProject(name) {
  this.ProjectName = name;
  //Friendly URL to ID --> FIRST OBSERVABLE
   this.af.database.object('/friendly_urls/' + name).take(1).share().map((data) => {
    //ID to data --> SECOND OBSERVABLE
     this.af.database.object('/Project/' + data.$value).take(1).map((ProjectData) => {
       console.log("Received Project data");
      this.ProjectData = ProjectData;
    });
  },
  error =>  {
    console.log(error);
    /* TODO: Permission blocked page */
    this.router.navigate(['']);
  });
}
}

我有两个可观察者:第一个可观察者,第一个被执行,第二个被执行 - 就在他之后执行。

我尝试了解如何在我的案例中使用this并且无法弄明白。

如何在没有可观察的内部可观察的系列中执行此observable?

2 个答案:

答案 0 :(得分:1)

您应该使用静态concat运算符,该运算符订阅第一个observable并在完成后订阅第二个observable。

let obs1 = this.af.database.object('/friendly_urls/' + name).map(data => data.$value);
let obs2 = this.af.database.object('/Project/' + data.$value).map(project => this.ProjectData = project);

let concatenatedObservables = Observable.concat(obs1, obs2);

concatenatedObservables.subscribe();

此处有更多信息http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-concat

答案 1 :(得分:1)

使用switchMap从第一个observable中获取值,并将其用作第二个observable的种子。首先,您设置(撰写)流:

projectData$ = this.af.database.object('/friendly_urls/'+name).share().switchMap(
    data => this.af.database.object('/Project/'+data.$value)
).take(1);

然后,当您想要提取数据时,只需subscribe

projectData$.subscribe(
    projectData => this.ProjectData = projectData,
    error => console.log(error);
)

More about switchMap