fix(facade): change EventEmitter to be sync by default (#8761)

This commit is contained in:
Rob Wormald 2016-05-26 09:34:04 -07:00 committed by Miško Hevery
parent cf1122cf9e
commit e5904f4089
5 changed files with 31 additions and 36 deletions

View File

@ -1527,11 +1527,10 @@ function declareTests(isJit: boolean) {
tick(); tick();
var tc = fixture.debugElement.children[0]; var tc = fixture.debugElement.children[0];
tc.inject(DirectiveEmittingEvent).fireEvent("boom");
try { try {
tick(); tc.inject(DirectiveEmittingEvent).fireEvent("boom");
throw "Should throw";
} catch (e) { } catch (e) {
clearPendingTimers(); clearPendingTimers();

View File

@ -115,7 +115,7 @@ export class EventEmitter<T> extends Subject<T> {
* Creates an instance of [EventEmitter], which depending on [isAsync], * Creates an instance of [EventEmitter], which depending on [isAsync],
* delivers events synchronously or asynchronously. * delivers events synchronously or asynchronously.
*/ */
constructor(isAsync: boolean = true) { constructor(isAsync: boolean = false) {
super(); super();
this.__isAsync = isAsync; this.__isAsync = isAsync;
} }

View File

@ -46,27 +46,27 @@ export function main() {
ObservableWrapper.callComplete(emitter); ObservableWrapper.callComplete(emitter);
})); }));
it("should subscribe to the wrapper asynchronously", () => { it("should subscribe to the wrapper synchronously", () => {
var called = false; var called = false;
ObservableWrapper.subscribe(emitter, (value) => { called = true; }); ObservableWrapper.subscribe(emitter, (value) => { called = true; });
ObservableWrapper.callEmit(emitter, 99); ObservableWrapper.callEmit(emitter, 99);
expect(called).toBe(false); expect(called).toBe(true);
}); });
// Makes Edge to disconnect when running the full unit test campaign // Makes Edge to disconnect when running the full unit test campaign
// TODO: remove when issue is solved: https://github.com/angular/angular/issues/4756 // TODO: remove when issue is solved: https://github.com/angular/angular/issues/4756
if (!browserDetection.isEdge) { if (!browserDetection.isEdge) {
it("delivers next and error events asynchronously", inject([AsyncTestCompleter], (async) => { it("delivers next and error events synchronously", inject([AsyncTestCompleter], (async) => {
let log = []; let log = [];
ObservableWrapper.subscribe(emitter, ObservableWrapper.subscribe(emitter,
(x) => { (x) => {
log.push(x); log.push(x);
expect(log).toEqual([1, 3, 5, 2]); expect(log).toEqual([1, 2]);
}, },
(err) => { (err) => {
log.push(err); log.push(err);
expect(log).toEqual([1, 3, 5, 2, 4]); expect(log).toEqual([1, 2, 3, 4]);
async.done(); async.done();
}); });
log.push(1); log.push(1);
@ -76,36 +76,39 @@ export function main() {
log.push(5); log.push(5);
})); }));
it("delivers next and complete events asynchronously", it("delivers next and complete events synchronously", () => {
inject([AsyncTestCompleter], (async) => {
let log = []; let log = [];
ObservableWrapper.subscribe(emitter, ObservableWrapper.subscribe(emitter,
(x) => { (x) => {
log.push(x); log.push(x);
expect(log).toEqual([1, 3, 5, 2]); expect(log).toEqual([1, 2]);
}, },
null, () => { null, () => {
log.push(4); log.push(4);
expect(log).toEqual([1, 3, 5, 2, 4]); expect(log).toEqual([1, 2, 3, 4]);
async.done(); });
});
log.push(1); log.push(1);
ObservableWrapper.callEmit(emitter, 2); ObservableWrapper.callEmit(emitter, 2);
log.push(3); log.push(3);
ObservableWrapper.callComplete(emitter); ObservableWrapper.callComplete(emitter);
log.push(5); log.push(5);
})); expect(log).toEqual([1, 2, 3, 4, 5]);
});
} }
it('delivers events synchronously', () => { it('delivers events asynchronously when forced to async mode', inject([AsyncTestCompleter], (async) => {
var e = new EventEmitter(false); var e = new EventEmitter(true);
var log = []; var log = [];
ObservableWrapper.subscribe(e, (x) => { log.push(x); }); ObservableWrapper.subscribe(e, (x) => {
log.push(x);
expect(log).toEqual([1, 3, 2]);
async.done();
});
log.push(1); log.push(1);
ObservableWrapper.callEmit(e, 2); ObservableWrapper.callEmit(e, 2);
log.push(3); log.push(3);
expect(log).toEqual([1, 2, 3]);
}); }));
it('reports whether it has subscribers', () => { it('reports whether it has subscribers', () => {
var e = new EventEmitter(false); var e = new EventEmitter(false);

View File

@ -44,11 +44,12 @@ export function main() {
}); });
it('should normalize urls on popstate', inject([AsyncTestCompleter], (async) => { it('should normalize urls on popstate', inject([AsyncTestCompleter], (async) => {
locationStrategy.simulatePopState('/my/app/user/btford');
location.subscribe((ev) => { location.subscribe((ev) => {
expect(ev['url']).toEqual('/user/btford'); expect(ev['url']).toEqual('/user/btford');
async.done(); async.done();
}) });
locationStrategy.simulatePopState('/my/app/user/btford');
})); }));
it('should revert to the previous path when a back() operation is executed', () => { it('should revert to the previous path when a back() operation is executed', () => {

View File

@ -193,19 +193,11 @@ export function main() {
expect(multiTrim(document.body.textContent)) expect(multiTrim(document.body.textContent))
.toEqual( .toEqual(
"ignore: -; " + "literal: Text; interpolate: Hello world; " + "ignore: -; " + "literal: Text; interpolate: Hello world; " +
"oneWayA: A; oneWayB: B; twoWayA: initModelA; twoWayB: initModelB; (1) | " + "oneWayA: A; oneWayB: B; twoWayA: newA; twoWayB: newB; (2) | " +
"modelA: initModelA; modelB: initModelB; eventA: ?; eventB: ?;"); "modelA: newA; modelB: newB; eventA: aFired; eventB: bFired;")
setTimeout(() => { ref.dispose();
// we need to do setTimeout, because the EventEmitter uses setTimeout to schedule async.done();
// events, and so without this we would not see the events processed. });
expect(multiTrim(document.body.textContent))
.toEqual("ignore: -; " + "literal: Text; interpolate: Hello world; " +
"oneWayA: A; oneWayB: B; twoWayA: newA; twoWayB: newB; (3) | " +
"modelA: newA; modelB: newB; eventA: aFired; eventB: bFired;");
ref.dispose();
async.done();
});
});
})); }));