refactor(async): refactor EventEmitter

Refactor EventEmitter and Async Facade to match ES7 Observable semantics, properly use RxJS typedefs, make EventEmitter inherit from RxJS Subject. Closes #4149.

BREAKING CHANGE:
- consumers of EventEmitter no longer need to call .toRx()
- EventEmitter is now generic and requires a type - e.g. `EventEmitter<string>`
- EventEmitter and Observable now use the `.subscribe(generatorOrNext, error, complete)` method instead of `.observer(generator)`
- ObservableWrapper uses `callNext/callError/callComplete` instead of `callNext/callThrow/callReturn`
This commit is contained in:
Rob Wormald
2015-10-24 18:48:43 -07:00
parent 72e65d6797
commit ca3986f31d
35 changed files with 341 additions and 113 deletions

View File

@ -44,7 +44,7 @@ export abstract class ClientMessageBroker {
export class ClientMessageBroker_ extends ClientMessageBroker {
private _pending: Map<string, PromiseCompleter<any>> = new Map<string, PromiseCompleter<any>>();
private _sink: EventEmitter;
private _sink: EventEmitter<any>;
/** @internal */
public _serializer: Serializer;

View File

@ -30,14 +30,14 @@ export abstract class MessageBus implements MessageBusSource, MessageBusSink {
* Returns an {@link EventEmitter} that emits every time a message
* is received on the given channel.
*/
abstract from(channel: string): EventEmitter;
abstract from(channel: string): EventEmitter<any>;
/**
* Returns an {@link EventEmitter} for the given channel
* To publish methods to that channel just call next (or add in dart) on the returned emitter
*/
abstract to(channel: string): EventEmitter;
abstract to(channel: string): EventEmitter<any>;
}
export interface MessageBusSource {
@ -60,7 +60,7 @@ export interface MessageBusSource {
* Returns an {@link EventEmitter} that emits every time a message
* is received on the given channel.
*/
from(channel: string): EventEmitter;
from(channel: string): EventEmitter<any>;
}
export interface MessageBusSink {
@ -83,5 +83,5 @@ export interface MessageBusSink {
* Returns an {@link EventEmitter} for the given channel
* To publish methods to that channel just call next (or add in dart) on the returned emitter
*/
to(channel: string): EventEmitter;
to(channel: string): EventEmitter<any>;
}

View File

@ -27,9 +27,9 @@ export class PostMessageBus implements MessageBus {
this.sink.initChannel(channel, runInZone);
}
from(channel: string): EventEmitter { return this.source.from(channel); }
from(channel: string): EventEmitter<any> { return this.source.from(channel); }
to(channel: string): EventEmitter { return this.sink.to(channel); }
to(channel: string): EventEmitter<any> { return this.sink.to(channel); }
}
export class PostMessageBusSink implements MessageBusSink {
@ -52,19 +52,17 @@ export class PostMessageBusSink implements MessageBusSink {
var emitter = new EventEmitter();
var channelInfo = new _Channel(emitter, runInZone);
this._channels[channel] = channelInfo;
emitter.observer({
next: (data: Object) => {
var message = {channel: channel, message: data};
if (runInZone) {
this._messageBuffer.push(message);
} else {
this._sendMessages([message]);
}
emitter.subscribe((data: Object) => {
var message = {channel: channel, message: data};
if (runInZone) {
this._messageBuffer.push(message);
} else {
this._sendMessages([message]);
}
});
}
to(channel: string): EventEmitter {
to(channel: string): EventEmitter<any> {
if (StringMapWrapper.contains(this._channels, channel)) {
return this._channels[channel].emitter;
} else {
@ -107,7 +105,7 @@ export class PostMessageBusSource implements MessageBusSource {
this._channels[channel] = channelInfo;
}
from(channel: string): EventEmitter {
from(channel: string): EventEmitter<any> {
if (StringMapWrapper.contains(this._channels, channel)) {
return this._channels[channel].emitter;
} else {
@ -140,7 +138,7 @@ export class PostMessageBusSource implements MessageBusSource {
* keeps track of if it should run in the zone.
*/
class _Channel {
constructor(public emitter: EventEmitter, public runInZone: boolean) {}
constructor(public emitter: EventEmitter<any>, public runInZone: boolean) {}
}
// TODO(jteplitz602) Replace this with the definition in lib.webworker.d.ts(#3492)

View File

@ -45,7 +45,7 @@ export abstract class ServiceMessageBroker {
* If that method returns a promise, the UIMessageBroker returns the result to the worker.
*/
export class ServiceMessageBroker_ extends ServiceMessageBroker {
private _sink: EventEmitter;
private _sink: EventEmitter<any>;
private _methods: Map<string, Function> = new Map<string, Function>();
constructor(messageBus: MessageBus, private _serializer: Serializer, public channel) {

View File

@ -14,7 +14,7 @@ import {StringMapWrapper} from 'angular2/src/core/facade/collection';
import {EventEmitter, ObservableWrapper} from 'angular2/src/core/facade/async';
export class EventDispatcher implements RenderEventDispatcher {
constructor(private _viewRef: RenderViewRef, private _sink: EventEmitter,
constructor(private _viewRef: RenderViewRef, private _sink: EventEmitter<any>,
private _serializer: Serializer) {}
dispatchRenderEvent(elementIndex: number, eventName: string, locals: Map<string, any>): boolean {