我是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 } );
可悲的是,它打印了#34; 3"而不是像 $ button 将事件直接发送到 $ source 而不是 $ client 。为什么 $ button.next(...)会发送到 $ source 而不是发送到 $ client ?我期望一个运算符(在这种情况下为 map())来生成新的流。如何实现仍然依赖于原始流的本地循环,但不修改原始流?提前谢谢。
答案 0 :(得分:2)
您所看到的结果是预期的,您无法实现的目标。
我期望一个运算符(在本例中为map())产生新流。
这是正确的,然而新生成的流是source$
的扩展名,所以:
$client = $source + map
// this means any data injected into client$
// will walk through an instance of source$ and then through the map-function
我知道,这只能解释行为,并没有提供解决方案" - 但是,为了正确地提供解决你的问题的好答案,你应该写一些关于你想要达到的目标 - 除非你想要的只是理解为什么会这样。
另外:它目前的结构方式看起来非常复杂,如果你提供了一些关于用例的信息,我相信这可以简化。
答案 1 :(得分:0)
添加中间主题( $ 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”。