Javascript 在这个setTimeout()示例中,为什么rxjs share操作符不能按预期工作?

Javascript 在这个setTimeout()示例中,为什么rxjs share操作符不能按预期工作?,javascript,typescript,rxjs,Javascript,Typescript,Rxjs,我不明白为什么rxjs share操作符不能使用setTimeout() 我正在努力理解这一点。在本例中,“共享订阅”的概念似乎并不像预期的那样有效 const observable1=可观察。创建(观察者=>{ 观察者。下一个(‘我还活着’); 设置超时(()=>{ 观察者。下一步(`我又活了。`); }, 1000); }).pipe(share()); subscribe(x=>console.log(x)); subscribe(x=>console.log(x)); 预期: I am

我不明白为什么rxjs share操作符不能使用
setTimeout()

我正在努力理解这一点。在本例中,“共享订阅”的概念似乎并不像预期的那样有效

const observable1=可观察。创建(观察者=>{
观察者。下一个(‘我还活着’);
设置超时(()=>{
观察者。下一步(`我又活了。`);
}, 1000);
}).pipe(share());
subscribe(x=>console.log(x));
subscribe(x=>console.log(x));
预期:

I am alive.
I am alive again.
实际:

I am alive.
I am alive again.
I am alive again.

这是share()的假定行为。它只监视和共享一个操作。下面是一个取自learnrxjs.com的示例。如您所见,仅监视tap()-运算符。忽略mapTo()-运算符

// RxJS v6+
import { timer } from 'rxjs';
import { tap, mapTo, share } from 'rxjs/operators';

//emit value in 1s
const source = timer(1000);
//log side effect, emit result
const example = source.pipe(
   tap(() => console.log('***SIDE EFFECT***')),
   mapTo('***RESULT***')
);

/*
  ***NOT SHARED, SIDE EFFECT WILL BE EXECUTED        
 TWICE***
  output:
  "***SIDE EFFECT***"
  "***RESULT***"
  "***SIDE EFFECT***"
  "***RESULT***"
*/
const subscribe = example.subscribe(val => console.log(val));
const subscribeTwo = example.subscribe(val => console.log(val));

//share observable among subscribers
const sharedExample = example.pipe(share());
/*
  ***SHARED, SIDE EFFECT EXECUTED ONCE***
  output:
  "***SIDE EFFECT***"
  "***RESULT***"
  "***RESULT***"
*/
const subscribeThree = sharedExample.subscribe(val => console.log(val));
const subscribeFour = sharedExample.subscribe(val => console.log(val));

这是预期的产出

从运营商的官方文件:

返回多播(共享)原始可观察对象的新可观察对象。只要至少有一个订阅者,这个可观察的将被订阅并发送数据

这意味着一旦观察者订阅,被观察者就开始发射数据

因此,当第一个subscribe语句
observable1.subscribe(x=>console.log(x))执行,观察者订阅,数据由观察者发出语句

当执行第二个subscribe语句时,另一个观察者进行订阅,它只接收从该时间点发出的数据。这是观测者发出的数据设置超时()

在这里我们可以清楚地看到这一点,我们将
observer 1
observer 2
文本与接收到的数据一起记录

我想困惑的是看到两个
我又活了。
语句它被记录两次,因为我们在每个订户中都记录了它。将这些日志语句移动到observable,它们将只记录一次。这使得可观察对象只执行一次变得更加明显