Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

111 строки
2.6 KiB

  1. /** @license
  2. * Copyright 2016 - present The Material Motion Authors. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy
  6. * of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations
  14. * under the License.
  15. */
  16. import IndefiniteObservable from '../../src';
  17. // Make a subclass of IndefiniteObservable to hold whatever operators you like.
  18. class MyStream extends IndefiniteObservable {
  19. map(predicate) {
  20. return new MyStream(
  21. (observer) => {
  22. let subscription = this.subscribe(
  23. (value) => {
  24. observer.next(
  25. predicate(value)
  26. );
  27. }
  28. );
  29. return subscription.unsubscribe;
  30. }
  31. );
  32. }
  33. }
  34. function createMove$(element) {
  35. let observers = new Set();
  36. return new MyStream(
  37. (observer) => {
  38. element.addEventListener('mousemove', observer.next);
  39. console.log('starting move$');
  40. observers.add(observer);
  41. updateInnerText();
  42. return function unsubscribe () {
  43. element.removeEventListener('mousemove', observer.next);
  44. console.log('stopping move$');
  45. observers.delete(observer);
  46. updateInnerText();
  47. }
  48. }
  49. );
  50. function updateInnerText() {
  51. let observerCount = observers.size;
  52. element.innerHTML = `observer count: ${ observerCount }`;
  53. if (observerCount) {
  54. element.innerHTML = `<div><strong>move your pointer here.</strong><br /><br />${ element.innerHTML }</div>`;
  55. }
  56. }
  57. }
  58. let track = document.getElementById('track');
  59. let doubled = document.getElementById('doubled');
  60. let excited = document.getElementById('excited');
  61. let move$ = createMove$(track).map(
  62. event => event.pageX
  63. );
  64. let doubledMove$ = move$.map(
  65. x => x + x
  66. );
  67. let excitedMove$ = move$.map(
  68. x => x + "!!!"
  69. );
  70. let doubledSubscription = doubledMove$.subscribe({
  71. next(value) {
  72. doubled.innerText = "doubled: " + value;
  73. }
  74. });
  75. let excitedSubscription = excitedMove$.subscribe(
  76. value => excited.innerText = "excited: " + value
  77. );
  78. doubled.addEventListener(
  79. 'click',
  80. () => {
  81. doubledSubscription.unsubscribe();
  82. doubled.innerText = 'unsubscribed';
  83. }
  84. );
  85. excited.addEventListener(
  86. 'click',
  87. () => {
  88. excitedSubscription.unsubscribe();
  89. excited.innerText = 'unsubscribed';
  90. }
  91. );