我想使用类似于Facebook的“ xyz正在输入”功能来创建聊天。

onKeydownSource.subscribe(function() {
  var typing = true;
}.bind(this));

onKeydownSource.throttle(500).subscribe(function(e) {
  var typing = false;
}.bind(this));


当用户停止输入时,我使用此代码段进行注册。

现在想象e是

{
    userId: 13,
    conversationId: 23
}


而我的信息流/订阅者是

onKeydownSource.subscribe(function(e) {
  typingInConversations[e.conversationId][e.userId] = true;
}.bind(this));

onKeydownSource
// What should be here?
.subscribe(function(e) {
  typingInConversations[e.conversationId][e.userId] = false;
}.bind(this));


这意味着我每次注册用户时都将注册该用户,并进行该用户所键入的对话。我的问题是,我该如何仅限制具有相同userId + conversationId的“事件”?

最佳答案

GroupBy可能是您想要的。它创建共享相同密钥的可观察组序列。在您的情况下,为会话中的每个键入用户创建一个新的可观察组,然后限制这些可观察组中的事件。

onKeydownSource.groupBy(
    function (e) { return e.conversationId + '-' + e.userId; },
    function (e) { return e; }
)
.subscribe(function(obs) {
    obs.throttle(500).subscribe(function (e) {
        typingInConversations[e.conversationId][e.userId] = false;
    });
});


第一个参数是提取每个元素的键的函数。您可能想在那里找到一些更好的方法。第二个参数是将每个源元素映射到可观察组中的元素的函数。在您的情况下,按原样传递元素。

关于javascript - RxJS响应式(Reactive)编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26074432/

10-09 17:28