Skip to content

Commit

Permalink
feat(core): support APP_INITIALIZER work with observable
Browse files Browse the repository at this point in the history
  • Loading branch information
vthinkxie committed Oct 17, 2019
1 parent d192a7b commit fa6f57d
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 4 deletions.
2 changes: 1 addition & 1 deletion gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'));
Expand Down
4 changes: 3 additions & 1 deletion packages/core/src/application_init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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());
}
}
}
Expand Down
47 changes: 45 additions & 2 deletions packages/core/test/application_init_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

{
Expand All @@ -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<any>;
let completerResolver = false;
Expand All @@ -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<any>;
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();

Expand Down

0 comments on commit fa6f57d

Please sign in to comment.