Angular How to use APP_INITIALIZER

In This tutorial, we look what is APP_INITIALIZER is and how to use in Angular applications. We will show you how to use it by creating an example app.

Applies to : Angular 4 to latest edition i.e Angular 8, Angular 9, Angular 10

What is APP_INITIALIZER

The APP_INITIALIZER is an instance of InjectionToken. It is a built in Injection token provided by Angular.

The Angular will execute the function provided by this token when the application loads. If the function returns the promise, then the angular will wait until the promise is resolved. This will make it ideal place to perform some initialization logic before the application is initialized.

Dependency Injection Recap

The Angular injector uses the DI token to locate the dependencies in the Angular Provider. We register the dependency in the provider using the token

The token can be either type, a string or an instance of InjectionToken.

The type token

The string token

The InjectionToken

The InjectionToken is used whenever the type that is being used does not have runtime representation such as when injecting an interface, callable type,array etc

Where to use APP_INITIALIZER

As mentioned earlier, the APP_INITIALIZER is run when the application is initialized. The Angular suspends the app initialization until all the functions provided by the APP_INITIALIZER are run. If any of those intializers return a promise, then the angular waits for it to resolve, before continuing with the App initialization

This gives us an opportunity to hook into the initialization process and run some our application custom logic. You can load runtime configuration information. load important data from the backend etc.


Best Angular Books
The Top 8 Best Angular Books, which helps you to get started with Angular  

APP_INITIALIZER Example

Create a new Angular Project

Create app-init.service.ts under the folder src/app.

This is a simple service, which has one method Init. The method returns a Promise.

Inside the method we have setup a timer which waits for 6000 milliseconds and then calls the resolve

Open the app.module.ts

First, we need to import APP_INITIALIZER from the @angular/core

We need to execute the appInitService.Init(). We cannot do it directly from the provider. We need to create a function which invokes the appInitService.Init() and returns a Promise. We do that in initializeApp1 function.

Finally,. use the APP_INITIALIZER token to provide the initializeApp1

The useFactory is used because initializeApp1 is a function and not a class. The Angular Injector executes this function , which in turn calls the appInitService.Init().

The Angular Dependency injection injects dependencies to classes & components, but not to functions. But our initializeApp1 is a function and needs AppInitService to be injected as the argument. We do that by using the deps: flag and let angular know that it needs to create a instance of AppInitService and inject it to the initializeApp1 function.

The multi : true creates the multi provider DI token. Which means that you can provide array of providers for a DI token.

If multi: false (which is default) is set and use a token more than once, the last to register will override all the previous tokens. i.e you can have only one provider for token.

If multi: true is set, then the new providers are added to the previously registered providers making it more than one provider for a token. The angular will execute all of them when the token in invoked.

The run the app & Open the Chrome developer console. You will see that the messages from the service appears first, before the “Angular running in development mode” message.

How to use APP_INITIALIZER in Angular

If you return reject from the service, the angular app will not start.

The Observables are not yet supported in APP_INITIALIZER

Multi Providers in APP_INITIALIZER

You can use the multi: true to create Multi Provider token. This means we can create more than one function/service and invoke it during initialization.

Create another factory function initializeApp2, which just writes to console after a timeout of 2000 milliseconds.

Next, register it with the APP_INITIALIZER token as shown below.

Run the app. You will observe the following

  1. Both initializeApp1 & initializeApp2 runs in succession without waiting for each other.
  2. initializeApp2 finishes first, although it is invoked after initializeApp1
  3. The Angular waits for both the functions to finish
Angular APP_INITIALIZER example

Suggested Readings

Angular Services
Angular Dependency Injection
Angular Injector, @Injectable & @Inject
Angular Providers
Hierarchical Dependency Injection

Summary

The APP_INITIALIZER is an instance of InjectionToken. It allows us to hook into the Angular Initialization process and run our custom logic like retrieving some important data

6 thoughts on “Angular How to use APP_INITIALIZER”

  1. Is It possible to run one APP_INITIALIZER before others? That initializeApp2 and initializeApp3 wait for initializeApp1 to finish before they start running?

  2. Thanks to share your knowledges, your article was useful and helps me to understand how the APP_INIZIALIZER works

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to Top