【问题标题】:Angular 5 & Rxjs: Wait for all subscriptionAngular 5 & Rxjs:等待所有订阅
【发布时间】:2018-02-02 13:41:06
【问题描述】:

我想在做某事之前等待我的所有 http 请求完成。

在 Angular 5 之前,我使用的是 Promise 和 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() 返回的是 Subscription 而不是 Observable

【问题讨论】:

    标签: javascript angular rxjs5


    【解决方案1】:

    getTemplates 中使用map 而不是subscribe

    getTemplates(): Observable<any> {
        return this.notifService.getTemplateList()
            .map(response => {
                /* ... */
                return reponse;
            });
    }
    

    【讨论】:

    • 但是订阅是最好的使用方式,一旦数据准备好就可以将数据加载到组件中
    • 如果我想在别处打电话给getTemplates(),那我就得订阅了,对吧?否则通话将无法完成。 getTemplates().subscribe()
    • check this订阅有多厉害
    • @Faly 请你解释一下为什么“地图”可以解决问题?我相信“map”会返回一个 Observable,您仍然需要订阅它才能获得结果。如何解决模板在数据可用之前不渲染的问题?
    猜你喜欢
    • 2019-09-05
    • 2021-04-14
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 2019-03-24
    • 2022-12-20
    相关资源
    最近更新 更多