我有以下方法:
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?
答案 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);
)