Agi*_*ilE 3 javascript reactive-programming rxjs
以下是我使用的HTML代码段作为示例:
<html>
<head>
<script src="rx.all.js"></script>
</head>
<body>
<script>
var source = new Rx.BehaviorSubject(function() {return 2;});
var stuff = source.scan([], function(val, operation) {
return operation(val);
});
stuff.subscribe(function(v) {
console.log("first subscriber");
console.log(v);
});
source.onNext(function(val) {
return val * 2;
});
stuff.subscribe(function(v) {
console.log("second subscriber");
console.log(v);
});
</script>
</body>
Run Code Online (Sandbox Code Playgroud)
JS控制台中的输出是:
first subscriber
2
first subscriber
4
second subscriber
0
Run Code Online (Sandbox Code Playgroud)
现在,"东西"做了一些处理(主要适用于当前值的函数),我已经从TodoMVC例如用于ReactJs + RxJS采取的想法(https://github.com/fdecampredon/react-rxjs-todomvc) .
我想要实现的输出是让第二个用户在订阅时也看到"4".我正在将RxJS与ReactJS结合使用,因此组件在卸载时会取消订阅(由于路由更改),并在再次安装时再次订阅.
使用replay(1)你改变stuff成热时观察到的,将记住上次的值,并将其提供给后来者:
var stuff = ...;
stuff = stuff.replay(1);
// go ahead and start it listening
// you could use .refCount() here also
var subscription = stuff.connect();
// now subscribe your observers
stuff.subscribe(...);
// send some results
source.onNext(...);
source.onNext(...);
// subscribe another observer
// will see the lastest value
// as well as any new values
stuff.subscribe(...);
source.onNext(...);
// ...
Run Code Online (Sandbox Code Playgroud)
要更新这个问题,replay现在已经从 rxjs 的运算符列表中删除了。一种策略是使用shareReplay
...您知道流的后期订阅者需要访问先前发出的值的情况。
所以你想要类似的代码
const $obs: Subject<boolean>;
const $newSharedObs = $obs.pipe(
shareReplay({bufferSize: 1, refCount: false })
);
$obs.next(true);
//will log true even though subscribe is called after next
$newSharedObs.subscribe(s => {
console.log(s);
});
Run Code Online (Sandbox Code Playgroud)
请注意,refCount: false即使它们没有订阅者,它也会保持可观察的“热”:
如果refCount为true,一旦引用计数降至零,源将被取消订阅,即内部ReplaySubject将被取消订阅。所有新订阅者都将从新的 ReplaySubject 接收值发射,这反过来又会导致对源可观察值的新订阅。另一方面,如果 refCount 为 false,则源不会被取消订阅,这意味着内部 ReplaySubject 仍将订阅源(并且可能永远运行)。
| 归档时间: |
|
| 查看次数: |
1700 次 |
| 最近记录: |