Angular5&Rxjs: 等待全部订阅
Angular 5 & Rxjs: Wait for all subscription
我想等我所有的 http 请求完成后再做某事。
在 Angular 5 之前,我使用的是 promises 和 Promise.All
。
有了 Angular 5 和新的 HttpClient
,我将我的承诺变成了可观察的。如果我理解正确的话,我现在必须使用 forkJoin
来替换 Promise.All
.
但这是一个问题,因为 forkJoin
期望 Observables 作为参数,但我已经在代码中订阅了那些
ngOnInit() {
forkJoin([this.getTemplates(), this.getHistory()]).subscribe(
results => {
this.isLoading = false;
}
);
}
getTemplates(): Observable<any> {
return this.notifService.getTemplateList()
.subscribe(
response => {
if (response.code === 0) {
this.templateList = response.data;
}
else {
this.openSnackBar(response.formatError());
}
},
error => {
this.openSnackBar(error);
});
}
我无法在 forkJoin
的订阅中执行逻辑,因为这些方法(getTemplates()
和 getHistory()
)需要独立并在其他进程中单独调用。
那么,我该怎么做才能确保所有订阅都已完成?
顺便说一句,上面的代码无法编译,因为方法 getTemplates()
return 是 Subscription
而不是 Observable
在getTemplates
中使用map
代替subscribe
:
getTemplates(): Observable<any> {
return this.notifService.getTemplateList()
.map(response => {
/* ... */
return reponse;
});
}
我想等我所有的 http 请求完成后再做某事。
在 Angular 5 之前,我使用的是 promises 和 Promise.All
。
有了 Angular 5 和新的 HttpClient
,我将我的承诺变成了可观察的。如果我理解正确的话,我现在必须使用 forkJoin
来替换 Promise.All
.
但这是一个问题,因为 forkJoin
期望 Observables 作为参数,但我已经在代码中订阅了那些
ngOnInit() {
forkJoin([this.getTemplates(), this.getHistory()]).subscribe(
results => {
this.isLoading = false;
}
);
}
getTemplates(): Observable<any> {
return this.notifService.getTemplateList()
.subscribe(
response => {
if (response.code === 0) {
this.templateList = response.data;
}
else {
this.openSnackBar(response.formatError());
}
},
error => {
this.openSnackBar(error);
});
}
我无法在 forkJoin
的订阅中执行逻辑,因为这些方法(getTemplates()
和 getHistory()
)需要独立并在其他进程中单独调用。
那么,我该怎么做才能确保所有订阅都已完成?
顺便说一句,上面的代码无法编译,因为方法 getTemplates()
return 是 Subscription
而不是 Observable
在getTemplates
中使用map
代替subscribe
:
getTemplates(): Observable<any> {
return this.notifService.getTemplateList()
.map(response => {
/* ... */
return reponse;
});
}