RxJs管道中share()运算符的必要性

RxJs管道中share()运算符的必要性,rxjs,multicast,Rxjs,Multicast,我正在使用一个依赖于RxJS的示例“保存指示器” 以下是完整的源代码: import { fromEvent, of, merge, empty, concat, defer } from 'rxjs'; import { delay, map, mergeMap, tap, debounceTime, distinctUntilChanged, mapTo, filter, share, switchAll } from 'rxjs/operators'

我正在使用一个依赖于RxJS的示例“保存指示器”

以下是完整的源代码:

import { fromEvent, of, merge, empty, concat, defer } from 'rxjs';
import {
  delay,
  map,
  mergeMap,
  tap,
  debounceTime,
  distinctUntilChanged,
  mapTo,
  filter,
  share,
  switchAll
} from 'rxjs/operators';
import { format } from 'date-fns';
​
// track in progress saves
let savesInProgress = 0;
​
// references
const input = document.getElementById('note-input');
const saveIndicator = document.querySelector('.save-indicator');
​
// streams
const keyup$ = fromEvent(input, 'keyup');
​
// fake save request
const saveChanges = value => {
  return of(value).pipe(delay(1500));
};
​
/**
 * Trigger a save when the user stops typing for 200ms
 * After new data has been successfully saved, so a saved
 * and last updated indicator.
 */
const inputToSave$ = keyup$.pipe(
  debounceTime(200),
  map(e => e.target.value),
  distinctUntilChanged(),
  share()//Here!!
);
​
const savesInProgress$ = inputToSave$.pipe(
  mapTo(of('Saving')),
  tap(_ => savesInProgress++)
);
​
const savesCompleted$ = inputToSave$.pipe(
  mergeMap(saveChanges),
  tap(_ => savesInProgress--),
  // ignore if additional saves are in progress
  filter(_ => !savesInProgress),
  mapTo(
    concat(
      // display saved for 2s
      of('Saved!'),
      empty().pipe(delay(2000)),
      // then last updated time, defer for proper time
      defer(() => of(`Last updated: ${format(Date.now(), 'MM/DD/YYYY hh:mm')}`))
    )
  )
);
​
merge(savesInProgress$, savesCompleted$)
  .pipe(
    /*
   If new save comes in when our completion observable is running, we want to switch to it for a status update.
  */
    switchAll()
  )
  .subscribe(status => {
    saveIndicator.innerHTML = status;
  });
以及可以找到源代码的链接:

我想知道为什么这里需要
share()
多播操作符。我已尝试删除它,但应用程序的行为保持不变

有人能解释一下为什么这里需要
share()
操作符吗


编辑:请记住只有一个订阅/订阅。

尝试在
共享
之前添加
点击(console.log)
,看看行为是否真的发生了变化。感谢您的评论。您希望看到管道的哪一部分发生变化?在
共享
之前,我尝试了
点击
:没有任何变化。@ritaj的评论可能与您看到的日志有所不同。虽然最后只订阅了一次,但您可以看到这是订阅了
merge(savesInProgress$,saveComplete$)
,它同时订阅了它们。它们中的每一个都订阅了
inputOSAVE$
,所以你最终在该流上有两个订阅。在这种情况下,这可能并不重要。。。也许使用share()会更有效率,因为它只会创建一个侦听器,并对其进行一次去噪、映射和比较,但在本例中,这并不重要。感谢你们两位!我没有意识到这两份订阅的事。