gpt4 book ai didi

javascript - Angular 6 - 在依赖注入(inject)之前使用异步调用初始化服务

转载 作者:行者123 更新时间:2023-12-05 07:31:28 25 4
gpt4 key购买 nike

我有一个基于环境文件的服务,在内存中加载一个配置对象。但是,设置的读取是异步的,应用程序甚至在所有设置加载和崩溃之前就启动了。在依赖注入(inject)完成之前,有什么方法可以“等待”这些功能。

我的服务:

import { Injectable } from '@angular/core';
import { IAppConfig } from '../models/app-config.model';

@Injectable()
export class AppConfig {
settings: IAppConfig;
version: any;

constructor() {
this.loadConfig();
}

// reads env.json file
// based on which environment it is loads config setting from
// environment specific config settings.

public loadConfig() {
return new Promise((resolve, reject) => {
const envFile = '/env.json';
this.readJsonFile(envFile).
then((envData) => {
const configFile = `assets/appconfigs/config.${envData.env}.json`;
this.version = envData.version;
this.readJsonFile(configFile).
then((configsettings) => {
this.settings = configsettings;
resolve(this.settings);
});
});
});
}

// reads json file and returns the json object promise
public readJsonFile(jsonUrl: string): any {
return new Promise((resolve, reject) => {
let retObject: any;
const xhr = new XMLHttpRequest();
xhr.overrideMimeType('application/json');
xhr.open('GET', jsonUrl, true);
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
retObject = JSON.parse(xhr.responseText);
resolve(retObject);
} else {
reject(`Could not load file '${jsonUrl}': ${xhr.status}`);
}
}
};
xhr.send(null);
});
}

我希望在应用程序启动之前加载设置对象。另一种方法是将此类设为静态并调用 loadConfig,但这对测试平台来说是一场噩梦。在模块中提供服务时有什么我可以指定的吗?

最佳答案

我不确定这个解决方案(未经测试的代码),但我猜你可以 async/await 一切。

是否有任何原因导致您不使用 Angular 的 http 服务,而是手动创建 XMLHttpRequest?

可能是这样的:

constructor() {
this.run()
}

async run() {
await this.loadConfig()
}

// reads env.json file
// based on which environment it is loads config setting from
// environment specific config settings.

public loadConfig() {
return new Promise( async (resolve, reject) => {
const envFile = '/env.json';

let envData = await this.readJsonFile(envFile)

const configFile = `assets/appconfigs/config.${envData.env}.json`;

this.version = envData.version;

this.settings = await this.readJsonFile(configFile);

resolve(); // No need to pass this.settings to resolve()
});
}

// reads json file and returns the json object promise
public readJsonFile(jsonUrl: string): any {
return this.http
.get(jsonUrl)
.map(res => res.json())
.toPromise()
}

关于javascript - Angular 6 - 在依赖注入(inject)之前使用异步调用初始化服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51780226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com