Observable在subcribe上发出所有值

时间:2017-01-24 16:56:38

标签: javascript angular typescript rxjs reactivex

我有一些看起来像这样的代码(这是一个更大项目的摘录):

this.oldMessagesSubject = new Subject<Message[]>();
this.oldMessages = this.oldMessagesSubject.asObservable();

getOldMessages(): Observable<Message[]> {
    this.chatHub.server.getMessages();
    return this.oldMessages;
}

然后我订阅它:

this.chatService.getOldMessages()
    .subscribe(res => this.messages = res);

我对ReactiveX不太熟悉,但是当我订阅getOldMessages()返回的observable时,它会遍历应用程序启动后收到的每个值。因此,如果我收到“聊天1”的旧消息,则可以正常工作。但是,如果我然后导航到另一个页面并获取“聊天2”的旧消息,则observable将发出“chat 1”消息,然后发出“chat 2”消息。

我有一种感觉,我以错误的方式使用Observables,我真的很感激任何帮助。

编辑: 这是next的调用地点:

this.chatHub.client.showMessages = (messages: Message[]) => this.oldMessagesSubject.next(messages);

getMessages是服务器的RPC。这是服务器上的相关方法(C#):

public Task GetMessages()
        {
            try
            {
                // Get the current user
                var user = repo.GetUser(Context.User.Identity.Name);
                // Associate the current user with a connection
                var connection = chatContext.Find(x => x.UserId == user.UserId);

                if (connection != null)
                {
                    // Get all the messages in the user's chat (encrypted)
                    List<EncryptedMessage> encryptedMessages = repo.GetMessages(connection.ChatId);
                    List<Message> messages = new List<Message>();
                    // Get the decrpytion key
                    byte[] key = Encoding.Default.GetBytes(ConfigurationManager.AppSettings["secret"]).Take(16).ToArray();

                    // Decrypt the messages
                    foreach (var encryptedMessage in encryptedMessages)
                    {
                        Message message = new Message();
                        message.Id = encryptedMessage.Id;
                        message.GroupId = encryptedMessage.GroupId;
                        message.Owner = encryptedMessage.Owner;
                        message.Sent = encryptedMessage.Sent;
                        message.Body = cryptoProvider.DecryptMessage(encryptedMessage.Body, key);

                        messages.Add(message);
                    }

                    // Return the messages to the client
                    return Clients.Caller.ShowMessages(messages);
                }

                return Clients.Caller.LoginError();
            }
            catch (Exception ex)
            {
                return Clients.Caller.Exception(ex);
            }
        }

当我回到工作站时,我会调试并检查问题不在服务器端。我应该能够判断每次订阅是否多次调用next

0 个答案:

没有答案