如何将Subject变量转换为Observable变量 [英] How to convert a Subject variable to an Observable variable

查看:46
本文介绍了如何将Subject变量转换为Observable变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

让我解释一下.这是我的HTML,用于显示这样的消息:

Let me explain. Here is my HTML to display my messages like this:

<message
    *ngFor="let message of thread.messages | async"
    [message]="message">
</message>

我的 thread.messages 变量是可观察的.

export class Thread {
  id: string;
  messages: Observable<Message[]> = new Observable<Message[]>();
}

在我的 addNewMessage()函数中,我创建了一个Subject变量,用于在以下位置添加新消息:

In my addNewMessage() function, I created a Subject variable to add the new messages in:

subjectMessages: Subject<Message[]> = new Subject<Message[]>();

addNewMessage(objMessage: any) : void {
  const newMessage = new Message(objMessage);
  this.subjectMessages.next([newMessage]);
  thread.messages = this.subjectMessages.asObservable();
}

我想将此 subjectMessages 变量转换为 thread.messages 变量.但这是行不通的.我的 thread.messages 变量包含一个Observable,但在HTML中不显示任何内容.

I want to convert this subjectMessages variable to the thread.messages variable. But it does not work. My thread.messages variable contains an Observable but it does not display anything in my HTML.

但是,最后一条消息的显示有效:

However, the display of the last message works :

thread.messages.subscribe((message: Message[]) => {
        [thread.lastMessage] = message;
});

我感到绝望,你知道我的错误会在哪里吗?为什么我可以查看最后一条消息,而不是所有消息?

I despair, do you know where my mistake would be ? Why can I view the last message, not all messages?

推荐答案

在这种情况下,将您在订户中获得的状态视为一种状态.在您的代码中,您发出包装在 [newMessage] 数组中的单个消息.订户将这些发射的值作为流获取.如果发出整个状态,则订阅者可以访问整个消息数组.

In this case, think of what you get in a subscriber as a state. In your code you emit a single message wrapped in an array, [newMessage]. The subscribers get these emitted values as stream. If you emit the whole state, the subscribers get access to the whole array of messages.

同时使用Subject和Observable似乎并不正确.我没有尝试过,但是如果您改为执行以下操作,则可能会这样:

It doesn't seem right to use both a Subject and an Observable. I haven't tried this but perhaps if you do something like this instead:

export class Thread {
  id: string;
  messages: Subject<Message[]> = new Subject<Message[]>();
}

messages: Message[] = new Message[];

addNewMessage(objMessage: any) : void {
  const newMessage = new Message(objMessage);
  messages.push(newMessage);
  thread.messages.next(messages);
}

或者也许更好的方法是查看 ReplaySubject BehaviorSubject ,它们也可以用于获取先前的消息.

Or perhaps a better approach would be to look at ReplaySubject or BehaviorSubject which can be used to get previous messages as well.

这篇关于如何将Subject变量转换为Observable变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆