我有一些看起来像这样的代码(这是一个更大项目的摘录):
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
。