Javascript 在这个setTimeout()示例中,为什么rxjs share操作符不能按预期工作?
我不明白为什么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
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,它们将只记录一次。这使得可观察对象只执行一次变得更加明显