我是Angular /打字的新手,有以下问题.对于你们中的大多数人来说,这可能是非常微不足道的. 在我的ngOnInit()岁时,我试图通过GET请求检索存储在我后端的设置.之后,我需要开始订阅一份《观察者》.可观察对象开始填充小部件(内容方面/它们随着时间的推移而变化),而设置则给出了将显示的小部件的数量/类型.

基本上,让ngOnInit()等待getGeneralSettingsOnce响应,然后开始一些其他订阅.

My request function:

getGeneralSettingsOnce(): Promise<any> {
    return this.http.get(`${environment.API_URL}/get_general_settings`).toPromise()
    .then(response => {
      return response
    })
  }

我的第一个try 是将主页的ngOnInit设置为一个异步函数,然后等待promise .-&gt;这将指向我的主页中一些静态小部件的Cannot read properties of undefined (reading '-1').根据我读到的一篇文章,这可能是因为我的主页没有完全加载,而浏览器已经在try 呈现页面?(不是很确定)来源:article

Parts of my ngOnInit of my main page

async ngOnInit() {  
    let generalSettings = await this.localService.getGeneralSettingsOnce(); //calling the promise
    this.widgetCount = generalSettings.widget_count

    // other subsrciptions
    this.localService.getWidgetContent().subscribe(
      data => { this.loadWidgetContent(data)
      } 
    }
}

所以我的问题是,我如何将我的目标存档,首先初始化设置,然后再提交给其他请求函数,就像它将是同步的一样.最好是不出现错误.

推荐答案

您可以 Select subscribe(从可观测对象获取数据的常用方法)与switchMap相结合,它可以执行一个又一个可观测对象!

    subscription: Subscription = new Subscription(); // <- stores observables to unsubscribe

    ngOnInit() {
        this.subscription.add( // <- add the subscription to a single place
            this.localService
                .getGeneralSettingsOnce()
                .pipe(
                    switchMap(generalSettings => {
                        this.widgetCount = generalSettings.widget_count;
                        // other subsrciptions
                        return this.localService.getWidgetContent();
                    })
                )
                .subscribe(data => {
                    this.loadWidgetContent(data);
                })
        );
    }

    ngOnDestroy() {
        this.subscription.unsubscribe(); // <- subscribers must be unsubscribed to prevent memory leaks
    }

Typescript相关问答推荐

替代语法/逻辑以避免TS变量被分配之前使用." "

类型{...}的TypeScript参数不能赋给类型为never的参数''

无法将select选项的值设置为ngFor循环中的第一个元素

HttpClient中的文本响应类型选项使用什么编码?''

Typescript泛型类型:按其嵌套属性映射记录列表

无法正确推断嵌套泛型?

如何根据特定操作隐藏按钮

Material UI / MUI系统:我如何告诉TypeScript主题是由提供程序传递的?

错误TS2403:后续变量声明必须具有相同的类型.变量';CRYPTO';的类型必须是';CRYPATO';,但这里的类型是';CRYPATO';

创建Angular 为17的动态形状时出错

为什么S struct 类型化(即鸭子类型化)需要非严格类型联合?

类型脚本-处理值或返回值的函数

抽象类对派生类强制不同的构造函数签名

我不明白使用打字脚本在模板中展开参考

如何使函数参数数组不相交?

有没有办法在Reaction组件中动态导入打字脚本`type`?

有没有什么方法可以使用ProvideState()提供多个削减器作为根减减器

可以将JS文件放在tsconfig';s includes/files属性?或者,我如何让tsc判断TS项目中的JS文件?

类型分布在第一个泛型上,但不分布在第二个泛型上

有没有一种简单的方法可以访问Keyboard Shortcuts JSON文件中列出的每个命令的显示名称(标题)?