Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions aio/content/examples/observables-in-angular/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// TODO: Add unit tests for this file.
// tslint:disable: no-output-native
// #docregion
import { Component, Output, OnInit, EventEmitter, NgModule } from '@angular/core';
Expand Down
6 changes: 5 additions & 1 deletion aio/content/examples/observables/example-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
"tests": [
{
"cmd": "yarn",
"args": [ "tsc", "--project", "./tsconfig.app.json" ]
"args": ["tsc", "--project", "tsconfig.spec.json", "--module", "commonjs"]
},
{
"cmd": "yarn",
"args": ["jasmine", "out-tsc/**/*.spec.js"]
}
]
}
55 changes: 55 additions & 0 deletions aio/content/examples/observables/src/creating.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { docRegionFromEvent, docRegionSubscriber } from './creating';

describe('observables', () => {
it('should create an observable using the constructor', () => {
const console = {log: jasmine.createSpy('log')};
docRegionSubscriber(console);
expect(console.log).toHaveBeenCalledTimes(4);
expect(console.log.calls.allArgs()).toEqual([
[1],
[2],
[3],
['Finished sequence'],
]);
});

it('should listen to input changes', () => {
let triggerInputChange;
const input = {
value: 'Test',
addEventListener: jasmine
.createSpy('addEvent')
.and.callFake((eventName: string, cb: (e) => void) => {
if (eventName === 'keydown') {
triggerInputChange = cb;
}
}),
removeEventListener: jasmine.createSpy('removeEventListener'),
};

const document = { getElementById: () => input };
docRegionFromEvent(document);
triggerInputChange({keyCode: 65});
expect(input.value).toBe('Test');

triggerInputChange({keyCode: 27});
expect(input.value).toBe('');
});

it('should call removeEventListener when unsubscribing', (doneFn: DoneFn) => {
const input = {
addEventListener: jasmine.createSpy('addEvent'),
removeEventListener: jasmine
.createSpy('removeEvent')
.and.callFake((eventName: string, cb: (e) => void) => {
if (eventName === 'keydown') {
doneFn();
}
})
};

const document = { getElementById: () => input };
const subscription = docRegionFromEvent(document);
subscription.unsubscribe();
});
});
73 changes: 38 additions & 35 deletions aio/content/examples/observables/src/creating.ts
Original file line number Diff line number Diff line change
@@ -1,38 +1,39 @@
// #docplaster

import { Observable } from 'rxjs';

// #docregion subscriber

// This function runs when subscribe() is called
function sequenceSubscriber(observer) {
// synchronously deliver 1, 2, and 3, then complete
observer.next(1);
observer.next(2);
observer.next(3);
observer.complete();
export function docRegionSubscriber(console) {
// #docregion subscriber
// This function runs when subscribe() is called
function sequenceSubscriber(observer) {
// synchronously deliver 1, 2, and 3, then complete
observer.next(1);
observer.next(2);
observer.next(3);
observer.complete();

// unsubscribe function doesn't need to do anything in this
// because values are delivered synchronously
return {unsubscribe() {}};
}

// Create a new Observable that will deliver the above sequence
Comment thread
gkalpak marked this conversation as resolved.
Resolved
const sequence = new Observable(sequenceSubscriber);

// execute the Observable and print the result of each notification
sequence.subscribe({
next(num) { console.log(num); },
complete() { console.log('Finished sequence'); }
});

// unsubscribe function doesn't need to do anything in this
// because values are delivered synchronously
return {unsubscribe() {}};
// Logs:
// 1
// 2
// 3
// Finished sequence
// #enddocregion subscriber
}

// Create a new Observable that will deliver the above sequence
const sequence = new Observable(sequenceSubscriber);

// execute the Observable and print the result of each notification
sequence.subscribe({
next(num) { console.log(num); },
complete() { console.log('Finished sequence'); }
});

// Logs:
// 1
// 2
// 3
// Finished sequence

// #enddocregion subscriber

// #docregion fromevent

function fromEvent(target, eventName) {
Expand All @@ -51,16 +52,18 @@ function fromEvent(target, eventName) {

// #enddocregion fromevent

// #docregion fromevent_use
export function docRegionFromEvent(document) {
// #docregion fromevent_use

const ESC_KEY = 27;
const nameInput = document.getElementById('name') as HTMLInputElement;
const ESC_KEY = 27;
const nameInput = document.getElementById('name') as HTMLInputElement;

const subscription = fromEvent(nameInput, 'keydown')
.subscribe((e: KeyboardEvent) => {
const subscription = fromEvent(nameInput, 'keydown').subscribe((e: KeyboardEvent) => {
if (e.keyCode === ESC_KEY) {
nameInput.value = '';
}
});
// #enddocregion fromevent_use
return subscription;
}

// #enddocregion fromevent_use
2 changes: 1 addition & 1 deletion aio/content/examples/observables/src/geolocation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// TODO: Add unit tests for this file.
import { Observable } from 'rxjs';

// #docregion

// Create an Observable that will start listening to geolocation updates
Expand Down
48 changes: 48 additions & 0 deletions aio/content/examples/observables/src/multicasting.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { docRegionDelaySequence, docRegionMulticastSequence } from './multicasting';

describe('multicasting', () => {
let console;
beforeEach(() => {
jasmine.clock().install();
console = {log: jasmine.createSpy('log')};
});

afterEach(() => {
jasmine.clock().uninstall();
});
Comment thread
gkalpak marked this conversation as resolved.
Resolved

it('should create an observable and emit in sequence', () => {
docRegionDelaySequence(console);
jasmine.clock().tick(10000);
expect(console.log).toHaveBeenCalledTimes(12);
expect(console.log.calls.allArgs()).toEqual([
[1],
['1st subscribe: 1'],
['2nd subscribe: 1'],
[2],
['1st subscribe: 2'],
['2nd subscribe: 2'],
[3],
['Finished sequence'],
['1st subscribe: 3'],
['1st sequence finished.'],
['2nd subscribe: 3'],
['2nd sequence finished.']
]);
});

it('should create an observable and multicast the emissions', () => {
docRegionMulticastSequence(console);
jasmine.clock().tick(10000);
expect(console.log).toHaveBeenCalledTimes(7);
expect(console.log.calls.allArgs()).toEqual([
['1st subscribe: 1'],
['1st subscribe: 2'],
['2nd subscribe: 2'],
['1st subscribe: 3'],
['2nd subscribe: 3'],
['1st sequence finished.'],
['2nd sequence finished.']
]);
});
});
Loading