Angular如何在应用初始化时运行代码详解


Posted in Javascript onJune 11, 2018

前言

想象一下,您的应用需要一些动态配置信息,这些信息在应用启动之前需要动态获取,并在应用运行中使用。

显然不能直接写道静态配置文件中,但是从客户端发出的请求又是一个异步请求,如何协调这个问题呢?

这里,我想向您演示,如何在 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();
   }, 3000);
  });
 }
 
 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[0].value;
  APP_SETTINGS.defaultImageUrl = settings[1].value;
 
  console.log(`APP_SETTINGS: `, APP_SETTINGS);
 
  return settings;
  });
 
 return promise;
 }
}

注意以下几点:

  • initializeApp 用于等待 3 秒,并输出日志来显示两个方法是并行执行的。
  • getSettings 调用一个模拟的我使用 APIARY 创建的 API 来或者设置。

    这里使用这些设置来设置 APP_SETTINGS 对象的

  • 它们都返回 Promise

运行应用

运行应用,可以在 Console 中查看如下输出

Angular如何在应用初始化时运行代码详解

注意:

  • 您可以看到两个方法都被调用了。
  • 设置首先返回
  • initializeApp 最后完成,然后应用启动。

如何从 settings 中获取 API 的地址?

有些人想:“如果没有 settings 来知道 URL, 我如何调用 API 呢?”,这是一个问题,您可以通过一个相对 URL 来通过 HttpClient ,并假设 API 在您的 Web 站点上。

参考资料

https://www.intertech.com/Blog/angular-4-tutorial-run-code-during-app-initialization/

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript 对象定义方法 简单易学
Mar 22 Javascript
SWFObject基本用法实例分析
Jul 20 Javascript
jQuery 调用WebService 实例讲解
Jun 28 Javascript
JavaScript中Array对象用法实例总结
Nov 29 Javascript
详解vue嵌套路由-query传递参数
May 23 Javascript
javascript将url解析为json格式的两种方法
Aug 18 Javascript
webpack+vue2构建vue项目骨架的方法
Jan 09 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
Mar 13 Javascript
Vue中$refs的用法详解
Jun 24 Javascript
js继承的这6种方式!(上)
Apr 23 Javascript
详解小程序如何改变onLoad的执行时机
Nov 01 Javascript
JS前端canvas交互实现拖拽旋转及缩放示例
Aug 05 Javascript
详解.vue文件解析的实现
Jun 11 #Javascript
vue filters的使用详解
Jun 11 #Javascript
Vue组件全局注册实现警告框的实例详解
Jun 11 #Javascript
jQuery实现的页面详情展开收起功能示例
Jun 11 #jQuery
Node.js中的cluster模块深入解读
Jun 11 #Javascript
详解vue-router 初始化时做了什么
Jun 11 #Javascript
node中间层实现文件上传功能
Jun 11 #Javascript
You might like
用javascript控制iframe滚动的代码
2007/04/10 Javascript
jQuery 对象中的类数组操作
2009/04/27 Javascript
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
Jquery 学习笔记(一)
2009/10/13 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
纯js写的分页表格数据为json串
2014/02/18 Javascript
Javascript高级技巧分享
2014/02/25 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
js正则表达式replace替换变量方法
2016/05/21 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
浅析vue中的MVVM实现原理
2019/03/04 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
Python如何获取系统iops示例代码
2016/09/06 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
python实现员工管理系统
2018/01/11 Python
python3实现磁盘空间监控
2018/06/21 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
英国图书音像网站:Hive.co.uk(图书、电子书、DVD、蓝光、音乐CD等)
2017/10/16 全球购物
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
车间组长岗位职责
2013/12/20 职场文书
小学中秋节活动方案
2014/02/06 职场文书
承诺书的格式范文
2014/03/28 职场文书
企业法人代表证明书
2014/09/27 职场文书
听课评课活动心得体会
2016/01/15 职场文书
如何解决springcloud feign 首次调用100%失败的问题
2021/06/23 Java/Android