Angular:在应用初始化时运行代码
想象一下,您的应用需要一些动态配置信息,这些信息在应用启动之前需要动态获取,并在应用运行中使用。
显然不能直接写道静态配置文件中,但是从客户端发出的请求又是一个异步请求,如何协调这个问题呢?
这里,我想向您演示,如何在 Angular 应用初始化期间,使用 APP_INITIALIZER 注入器来获取应用的动态配置信息。
什么是 APP_INITIALIZER 注入器
APP_INITIALIZER 是允许您在 Angular 初始化七千处理您自己任务的机制。它既可以用于 AppModule,核心模块,也可以用于您自己的应用加载模块中。典型的场景是应用加载之前做的事情,比如从服务处加载用于设置应用的配置信息。在示例中,我们使用它从服务器的 XML 配置文件中加载应用的设置信息。
创建 AppLoad 模块
尽管不是必要,通过创建 App Load module 还是对应用加载有助于隔离。
import { NgModule, APP_INITIALIZER } from '@angular/core';
import { HttpClientModule } from "@angular/common/http";
import { AppLoadService } from './app-load.service';
export function init_app(appLoadService: AppLoadService) {
    return () => appLoadService.initializeApp();
}
export function get_settings(appLoadService: AppLoadService) {
    return () => appLoadService.getSettings();
}
@NgModule({
  imports: [HttpClientModule],
  providers: [
    AppLoadService,
    { provide: APP_INITIALIZER, useFactory: init_app, deps: [AppLoadService], multi: true },
    { provide: APP_INITIALIZER, useFactory: get_settings, deps: [AppLoadService], multi: true }
  ]
})
export class AppLoadModule { }
注意一下几点:
- APP_INITIALIZER 导入自 @angular/core
 - 这里有多个 APP_INITIALIZER,它们在应用初始化过程中并发执行,直到它们全部完成。
- 使用 nulti: true 用于多个注入器,如果只有一个,使用 multi: false。
 
 - 工厂函数 init_app 和 get_settings 应当返回一个返回 Promise 的函数。
 - 该模块必须添加到 AppModule 的导入数组中。
 
创建 App Load Service
AppLoadService 应当隔离您在应用初始化期间的作为。当然这不是必须的,您可以使用任何需要的服务。
这里实现了两个方法我们在前面代码中使用的方法。在我们的 AppLoadModule 中作为依赖注入到提供器数组中。
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import 'rxjs/add/operator/toPromise';
import { APP_SETTINGS } from '../settings';
@Injectable()
export class AppLoadService {
  constructor(private httpClient: HttpClient) { }
  initializeApp(): Promise<any> {
    return new Promise((resolve, reject) => {
          console.log(`initializeApp:: inside promise`);
          setTimeout(() => {
            console.log(`initializeApp:: inside setTimeout`);
            // doing something
            resolve();
          }, );
        });
  }
  getSettings(): Promise<any> {
    console.log(`getSettings:: before http.get call`);
    const promise = this.httpClient.get('http://private-1ad25-initializeng.apiary-mock.com/settings')
      .toPromise()
      .then(settings => {
        console.log(`Settings from API: `, settings);
        APP_SETTINGS.connectionString = settings[].value;
        APP_SETTINGS.defaultImageUrl = settings[].value;
        console.log(`APP_SETTINGS: `, APP_SETTINGS);
        return settings;
      });
    return promise;
  }
}
注意以下几点:
- initializeApp 用于等待 3 秒,并输出日志来显示两个方法是并行执行的。
 - getSettings 调用一个模拟的我使用 APIARY 创建的 API 来或者设置。
- 这里使用这些设置来设置 APP_SETTINGS 对象的
 
 - 它们都返回 Promise
 
运行应用
运行应用,可以在 Console 中查看如下输出

注意:
- 您可以看到两个方法都被调用了。
 - 设置首先返回
 - initializeApp 最后完成,然后应用启动。
 
如何从 settings 中获取 API 的地址?
有些人想:“如果没有 settings 来知道 URL, 我如何调用 API 呢?”,这是一个问题,您可以通过一个相对 URL 来通过 HttpClient ,并假设 API 在您的 Web 站点上。
参考资料
https://www.intertech.com/Blog/angular-4-tutorial-run-code-during-app-initialization/
Angular:在应用初始化时运行代码的更多相关文章
- JavaEE初始化时静态代码块加载问题
		
1.使用java.exe命令运行某个类的时java.exe Person2.创建一个类的对象时Person p=new Person();3.访问类中的静态成员变量(赋值/获取值)System.out ...
 - JS - neo4j-browser 初始化时运行命令的逻辑分析
		
背景 最近需要改点 neo4j-browser 的代码做个 demo,分析初始化时运行命令的代码时花了很多时间,记录一下. 目的 找出 dispatch SINGLE_COMMAND_QUEUED a ...
 - spring boot 启动时运行代码(2)ApplicationListener
		
项目概览: StepExecutor: @Component @Slf4j public class StepExecutor implements Runnable { @Autowired pri ...
 - spring boot 系统启动时运行代码(1)-@PostConstruct
		
Application.java import org.springframework.boot.SpringApplication; import org.springframework.boot. ...
 - springAop 使用@Around,@After等注解时,代码运行两边的问题
		
springAop使用@Around,@After等注解时,代码运行两边的问题 将@Component注解删掉就好了
 - 如何在ASP.NET Core程序启动时运行异步任务(1)
		
原文:Running async tasks on app startup in ASP.NET Core (Part 1) 作者:Andrew Lock 译者:Lamond Lu 背景 当我们做项目 ...
 - angular自定义指令相关知识及代码
		
原文地址 https://www.jianshu.com/p/0c015862156d 大纲 1.自定义指令之——属性指令 2.自定义属性指令的运行原理 3.自定义属性指令代码实践 4.自定义结构指令 ...
 - ASP.NET Core 3.x启动时运行异步任务(一)
		
这是一个大的题目,需要用几篇文章来说清楚.这是第一篇. 一.前言 在我们的项目中,有时候我们需要在应用程序启动前执行一些一次性的逻辑.比方说:验证配置的正确性.填充缓存.或者运行数据库清理/迁移等 ...
 - 资源分享 | PyTea:不用运行代码,静态分析pytorch模型的错误
		
 前言 本文介绍一个Pytorch模型的静态分析器 PyTea,它不需要运行代码,即可在几秒钟之内扫描分析出模型中的张量形状错误.文末附使用方法. 本文转载自机器之心 编辑:CV技 ...
 
随机推荐
- Spring MVC 上下文(ApplicationContext)初始化入口
			
Spring 常用上下文容器有哪些 ApplicationContext ClassPathXmlApplicationContext ApplicationContext context = new ...
 - ScrimState.java
			
/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Versi ...
 - Unity中有限状态机的用法教程
			
Unity开发VR之Vuforia 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...
 - P2257  莫比乌斯+整除分块
			
#include<bits/stdc++.h> #define ll long long using namespace std; ; int vis[maxn]; int mu[maxn ...
 - RABBITMQ too many heartbeats missed
			
执行rabbitmqctl status | grep -A 4 file_descriptors 显示socket_used 达到 socket_limited 的值 增加socket_limi ...
 - git 之路
			
1. 不要把配置文件放到你的 Git 代码仓库 https://www.oschina.net/translate/dont-include-configs-in-your-git-repos 2. ...
 - Web前端3.0时代,“程序猿”如何“渡劫升仙”
			
Web前端入行门槛低,很多人在成为前端工程师后很容易进入工作的舒适区,认为该熟悉的业务已熟悉了,然后就是重复用轮子,这样很容易让自己的成长处于原地打转以及低水平重复的状态. 想要不被行业抛弃,就要努力 ...
 - vue- 项目之前端页面搭建1
			
项目分析 首页 导航.登录注册栏.轮播图.地板导航登录注册 选项卡免费课 课程分类.筛选.课程列表免费课详情 课程封面视频.优惠活动倒计时.选项卡我的购物车 全选.商品价格统计购买结算 购买成功 我的 ...
 - NetCore部署到Linux服务器+Supervisor的步骤及过程中踩过的坑
			
本文作备忘使用 服务器配置: 下面是所有操作的具体步骤: 1.安装nginx 参考 1.1 添加源:默认情况Centos7中没有Nginx源,最近Nginx官网提供了Centos的源地址. sud ...
 - HLS自习(1)
			
HLS自习(1) 处理器的处理方式: