【问题标题】:Ionic 4 with angular7 : Issue creating loader service (async/await)带有 angular7 的 Ionic 4:创建加载程序服务的问题(异步/等待)
【发布时间】:2019-05-31 20:27:53
【问题描述】:

我正在尝试在 Ionic4 LoadingController 之上创建一个包装服务 LoaderService

这是LoaderService的代码sn-p

export class LoaderService {

    loader: HTMLIonLoadingElement;

    constructor(public loadingController: LoadingController) {
        console.log('constructor called');
        this.createLoader();
    }

    async createLoader() {
        this.loader = await this.loadingController.create({
            message: 'Loading',
        });
        console.log('loader created');
    }

    async showLoader() {
        await this.loader.present();
    }

    hideLoader() {
        this.loader.dismiss();
    }

}

要实现的目标:使用服务我想在我的应用程序中创建一个加载器实例,并允许组件在进行 API 调用时显示和关闭加载器。

问题:当我在组件中使用LoaderService 时,我得到TypeError: Cannot read property 'present' of undefined。 这是因为在异步创建加载器之前调用了showLoader

这是我的组件在调用 API 和调用加载器时的代码:

getTopHeadlines() {
    this._loaderService.showLoader();
    this._newsApiServcie.getTopHeadLines('in')
        .subscribe(res => {
            this.articleList = res.articles;
            this._loaderService.hideLoader();
        });
}

另外,看看浏览器控制台

【问题讨论】:

  • 为什么不将 create 和 show loader 合并到一个异步方法中呢?我知道您想在这里进行优化,并且只“创建一次”,但这不会为您赢得太多

标签: javascript angular ionic-framework async-await ionic4


【解决方案1】:

由于加载控制器在关闭时被销毁,所以即使您的意图是高尚的(在内存中覆盖一个加载器然后显示/隐藏它) - 这种方法似乎不是最佳的。

动态创建加载器覆盖并没有什么坏处。我会将您的代码修改为如下所示:

加载器服务:

export class LoaderService {

    loader: HTMLIonLoadingElement;

    constructor(public loadingController: LoadingController) {
    }

    showLoader() {
        if (this.loader) { 
            this.loader.present()
        } else {
            this.loader = this.loadingController.create({
                message: 'Loading',
            }).then(() => {
                this.loader.present()
            })
        }
    }

    hideLoader() {
        this.loader.dismiss();
        this.loader = null;
    }

}

【讨论】:

  • 你不觉得,多次调用showLoader而不调用hideLoader或dismiss,内存中会有多个loader实例吗?
  • 我认为这可能是一个有效的问题,我添加了一小段代码,以确保每次调用 showLoader() 如果加载器已经存在,它将在新加载器出现之前被关闭已创建并且不引用先前的加载程序,现有 GC 应该清理内存。
  • 如果加载器已经存在,则无需将其设置为null并重新创建一个新的,我们可以只在旧实例上调用present()。
  • 实际上是有道理的;)我添加了代码。顺便说一句,有兴趣看看这是否适合你,我不妨在我的应用程序中实现它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2020-04-20
相关资源
最近更新 更多