diff --git a/gulpfile.js b/gulpfile.js index 8cfbc5318105a7..ef4139a09066c9 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -45,7 +45,7 @@ gulp.task('format:changed', ['format:untracked', 'format:diff']); // Alias for `format:changed` that formerly formatted all files. gulp.task('format', ['format:changed']); -gulp.task('lint', ['format:enforce', 'validate-commit-messages', 'tslint']); +gulp.task('lint', ['format:enforce', 'tslint']); gulp.task('tslint', ['tools:build'], loadTask('lint')); gulp.task('validate-commit-messages', loadTask('validate-commit-message')); gulp.task('source-map-test', loadTask('source-map-test')); diff --git a/packages/core/src/application_init.ts b/packages/core/src/application_init.ts index 4d85196e66cd80..be1747467071ac 100644 --- a/packages/core/src/application_init.ts +++ b/packages/core/src/application_init.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {isPromise} from '../src/util/lang'; +import {isObservable, isPromise} from '../src/util/lang'; import {Inject, Injectable, InjectionToken, Optional} from './di'; @@ -58,6 +58,8 @@ export class ApplicationInitStatus { const initResult = this.appInits[i](); if (isPromise(initResult)) { asyncInitPromises.push(initResult); + } else if (isObservable(initResult)) { + asyncInitPromises.push(initResult.toPromise()); } } } diff --git a/packages/core/test/application_init_spec.ts b/packages/core/test/application_init_spec.ts index 05069e561a37df..265647bddca0f1 100644 --- a/packages/core/test/application_init_spec.ts +++ b/packages/core/test/application_init_spec.ts @@ -7,6 +7,7 @@ */ import {Injector} from '@angular/core'; import {APP_INITIALIZER, ApplicationInitStatus} from '@angular/core/src/application_init'; +import {Observable} from 'rxjs'; import {TestBed, async, inject} from '../testing'; { @@ -26,7 +27,7 @@ import {TestBed, async, inject} from '../testing'; }))); }); - describe('with async initializers', () => { + describe('with async promise initializers', () => { let resolve: (result: any) => void; let promise: Promise; let completerResolver = false; @@ -51,7 +52,49 @@ import {TestBed, async, inject} from '../testing'; }); }); - it('should update the status once all async initializers are done', + it('should update the status once all async promise initializers are done', + async(inject([ApplicationInitStatus], (status: ApplicationInitStatus) => { + (status as any).runInitializers(); + + setTimeout(() => { + completerResolver = true; + resolve(null); + }); + + expect(status.done).toBe(false); + status.donePromise.then(() => { + expect(status.done).toBe(true); + expect(completerResolver).toBe(true); + }); + }))); + }); + + describe('with async observable initializers', () => { + let resolve: (result: any) => void; + let observable: Observable; + let completerResolver = false; + beforeEach(() => { + let initializerFactory = (injector: Injector) => { + return () => { + const initStatus = injector.get(ApplicationInitStatus); + initStatus.donePromise.then(() => { expect(completerResolver).toBe(true); }); + }; + }; + observable = new Observable((res) => { res.complete(); }); + TestBed.configureTestingModule({ + providers: [ + {provide: APP_INITIALIZER, multi: true, useValue: () => observable}, + { + provide: APP_INITIALIZER, + multi: true, + useFactory: initializerFactory, + deps: [Injector] + }, + ] + }); + }); + + it('should update the status once all async observable initializers are done', async(inject([ApplicationInitStatus], (status: ApplicationInitStatus) => { (status as any).runInitializers();