Cold vs. Hot Observables - https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<script src="https://code.jquery.com/jquery-2.2.4.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.6/rx.all.compat.js"></script>
<body>
<script id="jsbin-javascript">
"use strict";
console.log('Current time: ' + Date.now());
var source = Rx.Observable.interval(1000);
var hot = source.publish();
var subscription1 = source.subscribe(function (x) { return console.log('Observer 1: Next: ' + x); }, function (e) { return console.log('Observer 1: Error: ' + e.message); }, function () { return console.log('Observer 1: Completed'); });
console.log('Current Time after 1st subscription: ' + Date.now());
setTimeout(function () {
hot.connect();
console.log('Current Time after connect: ' + Date.now());
setTimeout(function () {
var subscription2 = source.subscribe(function (x) { return console.log('Observer 2: Next: ' + x); }, function (e) { return console.log('Observer 2: Error: ' + e.message); }, function () { return console.log('Observer 2: Completed'); });
}, 3000);
}, 3000);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNiaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJqc2Jpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUUzQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUUxQyxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7QUFFM0IsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDbEMsVUFBQyxDQUFDLElBQUssT0FBQSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxFQUFyQyxDQUFxQyxFQUM1QyxVQUFDLENBQUMsSUFBSyxPQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUE5QyxDQUE4QyxFQUNyRCxjQUFNLE9BQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFwQyxDQUFvQyxDQUMzQyxDQUFDO0FBRUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUVsRSxVQUFVLENBQUM7SUFFVCxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFFZCxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRXpELFVBQVUsQ0FBQztRQUNULElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ2xDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsRUFBckMsQ0FBcUMsRUFDNUMsVUFBQyxDQUFDLElBQUssT0FBQSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBOUMsQ0FBOEMsRUFDckQsY0FBTSxPQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsRUFBcEMsQ0FBb0MsQ0FDM0MsQ0FBQztJQUNKLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUVYLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImNvbnNvbGUubG9nKCdDdXJyZW50IHRpbWU6ICcgKyBEYXRlLm5vdygpKTtcblxudmFyIHNvdXJjZSA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCk7XG5cbnZhciBob3QgPSBzb3VyY2UucHVibGlzaCgpO1xuXG52YXIgc3Vic2NyaXB0aW9uMSA9IHNvdXJjZS5zdWJzY3JpYmUoXG4gICh4KSA9PiBjb25zb2xlLmxvZygnT2JzZXJ2ZXIgMTogTmV4dDogJyArIHgpLFxuICAoZSkgPT4gY29uc29sZS5sb2coJ09ic2VydmVyIDE6IEVycm9yOiAnICsgZS5tZXNzYWdlKSwgXG4gICgpID0+IGNvbnNvbGUubG9nKCdPYnNlcnZlciAxOiBDb21wbGV0ZWQnKVxuKTtcblxuY29uc29sZS5sb2coJ0N1cnJlbnQgVGltZSBhZnRlciAxc3Qgc3Vic2NyaXB0aW9uOiAnICsgRGF0ZS5ub3coKSk7XG5cbnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICBcbiAgaG90LmNvbm5lY3QoKTtcbiAgXG4gIGNvbnNvbGUubG9nKCdDdXJyZW50IFRpbWUgYWZ0ZXIgY29ubmVjdDogJyArIERhdGUubm93KCkpO1xuICBcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN1YnNjcmlwdGlvbjIgPSBzb3VyY2Uuc3Vic2NyaWJlKFxuICAgICAgKHgpID0+IGNvbnNvbGUubG9nKCdPYnNlcnZlciAyOiBOZXh0OiAnICsgeCksXG4gICAgICAoZSkgPT4gY29uc29sZS5sb2coJ09ic2VydmVyIDI6IEVycm9yOiAnICsgZS5tZXNzYWdlKSwgXG4gICAgICAoKSA9PiBjb25zb2xlLmxvZygnT2JzZXJ2ZXIgMjogQ29tcGxldGVkJylcbiAgICApO1xuICB9LCAzMDAwKTtcbiBcbn0sIDMwMDApOyJdfQ==
</script>
<script id="jsbin-source-javascript" type="text/javascript">console.log('Current time: ' + Date.now());
var source = Rx.Observable.interval(1000);
var hot = source.publish();
var subscription1 = source.subscribe(
(x) => console.log('Observer 1: Next: ' + x),
(e) => console.log('Observer 1: Error: ' + e.message),
() => console.log('Observer 1: Completed')
);
console.log('Current Time after 1st subscription: ' + Date.now());
setTimeout(function () {
hot.connect();
console.log('Current Time after connect: ' + Date.now());
setTimeout(function () {
var subscription2 = source.subscribe(
(x) => console.log('Observer 2: Next: ' + x),
(e) => console.log('Observer 2: Error: ' + e.message),
() => console.log('Observer 2: Completed')
);
}, 3000);
}, 3000);
</script></body>
</html>
"use strict";
console.log('Current time: ' + Date.now());
var source = Rx.Observable.interval(1000);
var hot = source.publish();
var subscription1 = source.subscribe(function (x) { return console.log('Observer 1: Next: ' + x); }, function (e) { return console.log('Observer 1: Error: ' + e.message); }, function () { return console.log('Observer 1: Completed'); });
console.log('Current Time after 1st subscription: ' + Date.now());
setTimeout(function () {
hot.connect();
console.log('Current Time after connect: ' + Date.now());
setTimeout(function () {
var subscription2 = source.subscribe(function (x) { return console.log('Observer 2: Next: ' + x); }, function (e) { return console.log('Observer 2: Error: ' + e.message); }, function () { return console.log('Observer 2: Completed'); });
}, 3000);
}, 3000);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNiaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJqc2Jpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUUzQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUUxQyxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7QUFFM0IsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDbEMsVUFBQyxDQUFDLElBQUssT0FBQSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxFQUFyQyxDQUFxQyxFQUM1QyxVQUFDLENBQUMsSUFBSyxPQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUE5QyxDQUE4QyxFQUNyRCxjQUFNLE9BQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFwQyxDQUFvQyxDQUMzQyxDQUFDO0FBRUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUVsRSxVQUFVLENBQUM7SUFFVCxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFFZCxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRXpELFVBQVUsQ0FBQztRQUNULElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ2xDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsRUFBckMsQ0FBcUMsRUFDNUMsVUFBQyxDQUFDLElBQUssT0FBQSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBOUMsQ0FBOEMsRUFDckQsY0FBTSxPQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsRUFBcEMsQ0FBb0MsQ0FDM0MsQ0FBQztJQUNKLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUVYLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImNvbnNvbGUubG9nKCdDdXJyZW50IHRpbWU6ICcgKyBEYXRlLm5vdygpKTtcblxudmFyIHNvdXJjZSA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCk7XG5cbnZhciBob3QgPSBzb3VyY2UucHVibGlzaCgpO1xuXG52YXIgc3Vic2NyaXB0aW9uMSA9IHNvdXJjZS5zdWJzY3JpYmUoXG4gICh4KSA9PiBjb25zb2xlLmxvZygnT2JzZXJ2ZXIgMTogTmV4dDogJyArIHgpLFxuICAoZSkgPT4gY29uc29sZS5sb2coJ09ic2VydmVyIDE6IEVycm9yOiAnICsgZS5tZXNzYWdlKSwgXG4gICgpID0+IGNvbnNvbGUubG9nKCdPYnNlcnZlciAxOiBDb21wbGV0ZWQnKVxuKTtcblxuY29uc29sZS5sb2coJ0N1cnJlbnQgVGltZSBhZnRlciAxc3Qgc3Vic2NyaXB0aW9uOiAnICsgRGF0ZS5ub3coKSk7XG5cbnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICBcbiAgaG90LmNvbm5lY3QoKTtcbiAgXG4gIGNvbnNvbGUubG9nKCdDdXJyZW50IFRpbWUgYWZ0ZXIgY29ubmVjdDogJyArIERhdGUubm93KCkpO1xuICBcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN1YnNjcmlwdGlvbjIgPSBzb3VyY2Uuc3Vic2NyaWJlKFxuICAgICAgKHgpID0+IGNvbnNvbGUubG9nKCdPYnNlcnZlciAyOiBOZXh0OiAnICsgeCksXG4gICAgICAoZSkgPT4gY29uc29sZS5sb2coJ09ic2VydmVyIDI6IEVycm9yOiAnICsgZS5tZXNzYWdlKSwgXG4gICAgICAoKSA9PiBjb25zb2xlLmxvZygnT2JzZXJ2ZXIgMjogQ29tcGxldGVkJylcbiAgICApO1xuICB9LCAzMDAwKTtcbiBcbn0sIDMwMDApOyJdfQ==