首页 手册 参考 源码 测试 关于中文版Repository
暗色主题亮色主题

es6/operator/takeUntil.js

  1. import { OuterSubscriber } from '../OuterSubscriber';
  2. import { subscribeToResult } from '../util/subscribeToResult';
  3. /**
  4. * 发出源 Observable 发出的值,直到 `notifier` Observable 发出值。
  5. *
  6. * <span class="informal">它发出源 Observable 的值,然后直到第二个
  7. * Observable (即 notifier )发出项,它便完成。</span>
  8. *
  9. * <img src="./img/takeUntil.png" width="100%">
  10. *
  11. * `takeUntil` 订阅并开始镜像源 Observable 。它还监视另外一个 Observable,即你
  12. * 提供的 `notifier` 。如果 `notifier` 发出值或 `complete` 通知,那么输出 Observable
  13. * 停止镜像源 Observable ,然后完成。
  14. *
  15. * @example <caption>每秒都发出值,直到第一次点击发生</caption>
  16. * var interval = Rx.Observable.interval(1000);
  17. * var clicks = Rx.Observable.fromEvent(document, 'click');
  18. * var result = interval.takeUntil(clicks);
  19. * result.subscribe(x => console.log(x));
  20. *
  21. * @see {@link take}
  22. * @see {@link takeLast}
  23. * @see {@link takeWhile}
  24. * @see {@link skip}
  25. *
  26. * @param {Observable} notifier 该 Observable 第一次发出值会使 `takeUntil` 的
  27. * 输出 Observable 停止发出由源 Observable 所发出的值。
  28. * @return {Observable<T>} 该 Observable 发出源 Observable 所发出的值,直到某个
  29. * 时间点 `notifier` 发出它的第一个值。
  30. * @method takeUntil
  31. * @owner Observable
  32. */
  33. export function takeUntil(notifier) {
  34. return this.lift(new TakeUntilOperator(notifier));
  35. }
  36. class TakeUntilOperator {
  37. constructor(notifier) {
  38. this.notifier = notifier;
  39. }
  40. call(subscriber, source) {
  41. return source.subscribe(new TakeUntilSubscriber(subscriber, this.notifier));
  42. }
  43. }
  44. /**
  45. * We need this JSDoc comment for affecting ESDoc.
  46. * @ignore
  47. * @extends {Ignored}
  48. */
  49. class TakeUntilSubscriber extends OuterSubscriber {
  50. constructor(destination, notifier) {
  51. super(destination);
  52. this.notifier = notifier;
  53. this.add(subscribeToResult(this, notifier));
  54. }
  55. notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
  56. this.complete();
  57. }
  58. notifyComplete() {
  59. // noop
  60. }
  61. }
  62. //# sourceMappingURL=takeUntil.js.map