Creé un servicio SocketService, básicamente inicializa el socket para permitir que la aplicación escuche en el puerto. Este servicio también interactúa con algunos componentes.
// socket.servicio.ts
export class SocketService { constructor() { // Initializes the socket } ... }Sé que el código en el constructor() de SocketService solo comienza a ejecutarse cuando un componente usa SocketService.
Y, por lo general, el código en app.ts se ve así:
// aplicación.ts
import {SocketService} from './socket.service'; ... class App { constructor () {} } bootstrap(App, [SocketService]); Sin embargo, quiero que este servicio se ejecute cuando se inicie la aplicación. Así que hice un truco, solo agregue private _socketService: SocketService en el constructor de la aplicación (). Así que ahora los códigos se ven así:
// aplicaciones.ts (nuevo)
import {SocketService} from './socket.service'; ... class App { constructor (private _socketService: SocketService) {} } bootstrap(App, [SocketService]);Ahora funciona. El problema es que a veces se ejecutan los códigos en el constructor() de SocketService, a veces no. Entonces, ¿cómo debo hacerlo correctamente? Gracias
La respuesta de Stuart apunta en la dirección correcta, pero no es fácil encontrar información sobre APP_INITIALIZER. La versión corta es que puede usarla para ejecutar el código de inicialización antes de que se ejecute cualquier otro código de aplicación. Busqué un rato y encontré explicaciones aquí y aquí , que resumiré por si desaparecen de la web.
APP_INITIALIZER se define en angular/core. Lo incluyes en tu app.module.ts así.
import { APP_INITIALIZER } from '@angular/core';APP_INITIALIZER es un OpaqueToken (o un InjectionToken desde Angular 4) que hace referencia al servicio ApplicationInitStatus. ApplicationInitStatus es un proveedor múltiple . Admite múltiples dependencias y puede usarlo en su lista de proveedores varias veces. Se usa así.
@NgModule({ providers: [ DictionaryService, { provide: APP_INITIALIZER, useFactory: (ds: DictionaryService) => () => return ds.load(), deps: [DictionaryService], multi: true }] }) export class AppModule { }Esta declaración de proveedor le dice a la clase ApplicationInitStatus que ejecute el método DictionaryService.load(). load() devuelve una promesa y ApplicationInitStatus bloquea el inicio de la aplicación hasta que se resuelve la promesa. La función load() se define así.
load(): Promise<any> { return this.dataService.getDiscardReasons() .toPromise() .then( data => { this.dictionaries.set("DISCARD_REASONS",data); } ) }Configurado así, el diccionario se carga primero y las otras partes de la aplicación pueden depender de él de manera segura.
Editar: tenga en cuenta que esto aumentará el tiempo de carga inicial para su aplicación por el tiempo que tarde el método load(). Si desea evitar eso, puede usar un resolver en su ruta.
Mueva la lógica en su constructor de SocketService a un método en su lugar y luego llámelo en el constructor de su componente principal o ngOnInit
ServicioSocket
export class SocketService{ init(){ // Startup logic here } }aplicación
import {SocketService} from './socket.service'; ... class App { constructor (private _socketService: SocketService) { _socketService.init(); } } bootstrap(App, [SocketService]);Consulte también APP_INITIALIZER , que se describe como;
Una función que se ejecutará cuando se inicialice una aplicación.