next() 到中间 Observable

next() to intermediate Observable

我是 RxJS 的新手,所以我的术语可能不够简洁,抱歉。我使用 map() 创建了派生的 Observable,并希望它继续通过自身传递它的源值以及在此之上的其他事件。例如:

//receiving values from server:
const $source = new Rx.Subject;

//map from network representation to client one:
const $client = $source.map( server => server.x + server.y );
//display on screen:
$client.subscribe( client => console.log( "client:", client ) )

//have input to update client-side representation:
const $button = new Rx.Subject;
$button.subscribe( $client );

$button.next( { x : 1, y : 2 } );

遗憾的是,它打印“3”而不是对象,就好像 $button 将事件直接发送到 $source 而不是 $客户。为什么 $button.next(...) 发送到 $source 而不是发送到 $client?我期望一个操作员(map() 在这种情况下)产生新的流。我怎样才能实现一个本地循环,使其仍然依赖于原始流,但不修改原始流?提前致谢。

您看到的结果是预期的结果,而您想要达到的结果是不可能的。

I expected an operator (map() in this case) to spawn new stream.

这是正确的,但是新生成的流是 source$ 的扩展,所以:

$client = $source + map
// this means any data injected into client$
// will walk through an instance of source$ and then through the map-function

我知道,这仅解释了行为,并没有提供 "solution" - 但是,要正确提供 解决 您的问题的良好答案,您应该写下你正在努力实现的目标 - 除非你只想了解为什么会这样。

此外:它当前的结构方式看起来确实过于复杂,我相信如果您提供一些有关用例的信息,这可以简化。

添加中间主题 ($anotherSource) 并将其与原始 $source 合并解决了问题:

//eternal values receive from server:
const $source = new Rx.Subject;
$source.subscribe( () => console.log( "Should not" ) );

const $anotherSource = new Rx.Subject;

//map from network representation:
const $client = $source.map( server => server.x + server.y ).merge( $anotherSource );
//display on screen:
$client.subscribe( client => console.log( "client:", client ) )

//have input to update client-side representation interleaving with server one:
const $button = new Rx.Subject;
$button.subscribe( $anotherSource );

$button.next( { x : 1, y : 2 } );

$client 现在收到对象而不是预期的“3”。