ReactiveX:Group和Buffer仅为每个组中的最后一项

时间:2015-12-08 00:21:09

标签: javascript rxjs reactivex

如何对一个Observable进行分组,并从每个GroupedObservable只保留内存中最后一个发出的项目? 这样每个组的行为就像BehaviorSubject一样。

这样的事情:

{user: 1, msg: "Anyone here?"}
{user: 2, msg: "Hi"}
{user: 2, msg: "How are you?"}
{user: 1, msg: "Hello"}
{user: 1, msg: "Good"}

因此,在内存中,我们只有每个user的最后一项:

{user: 2, msg: "How are you?"}
{user: 1, msg: "Good"}

当订阅者订阅时,这两个项目立即发布(每个项目都在其自己的排放中)。就像我们为每个user设置了BehaviorSubject。

onCompleted()永远不会被激发,因为人们可能永远在聊天。

我事先并不知道可能有user个值。

2 个答案:

答案 0 :(得分:3)

我认为你的chatlog可观察性很热。因此,#groupBy发出的groupObservable也会变热,并且不会将任何内容保留在内存中。

要获得所需的行为(丢弃除订阅之前的最后一个值并从那里继续),您可以使用ReplaySubject(1)。

如果我错了,请纠正我

请参阅jsbin

->    FUNCTION CHAR(DATO1 : STRING) RETURN STD_LOGIC_VECTOR IS     
VARIABLE DATAOUT1 : STD_LOGIC_VECTOR(8 DOWNTO 0);
BEGIN
    CASE DATO1 IS
    WHEN a => RETURN '1'&x"09";
    WHEN b => RETURN '1'&x"0A";
    WHEN c => RETURN '1'&x"0B";
    WHEN d => RETURN '1'&x"0C";
    WHEN e => RETURN '1'&x"0D";
    WHEN f => RETURN '1'&x"0E";
    WHEN g => RETURN '1'&x"0F";
    WHEN h => RETURN '1'&x"10";
    WHEN i => RETURN '1'&x"11";
    WHEN j => RETURN '1'&x"12";
    WHEN k => RETURN '1'&x"13";
    WHEN l => RETURN '1'&x"14";

答案 1 :(得分:1)

您可以编写reduce函数,该函数生成分组可观察量的最新发射项,将其传递给scan可观察对象,并使用shareReplay调用为新订阅者发出的最后值。它会是这样的:

var fn_scan = function ( aMessages, message ) {
  // aMessages is the latest array of messages
  // this function will update aMessages to reflect the arrival of the new message
  var aUsers = aMessages.map(function ( x ) {return x.user;});
  var index = aUsers.indexOf(message.user);
  if (index > -1) {
    // remove previous message from that user...
    aMessages.splice(index, 1);
  }
  // ...and push the latest message
  aMessages.push(message);
  return aMessages;
};
var groupedLatestMessages$ = messages$
    .scan(fn_scan, [])
    .shareReplay(1);

因此,您订阅的任何内容都是一个数组,其大小随时都是发出消息的用户数量,其内容将是按发射时间排序的用户发出的消息。

任何订阅时,最新的阵列都会立即传递给订阅者。虽然这是一个阵列,但我无法想到如何逐个传递值,同时满足您的规格。希望这足以满足您的使用需求。

更新:jsbin here http://jsfiddle.net/zs7ydw6b/2