RxJS将当前值推向后期订户

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结合使用,因此组件在卸载时会取消订阅(由于路由更改),并在再次安装时再次订阅.

Bra*_*don 5

使用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)


Lia*_*iam 1

要更新这个问题,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 仍将订阅源(并且可能永远运行)。