如何对一个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
个值。
答案 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