【问题标题】:How to create new Subject for object?如何为对象创建新的主题?
【发布时间】:2022-11-23 22:03:31
【问题描述】:

如何为对象创建新的主题,或者我必须只使用行为主题?

public myObject: Subject<any> =
    new Subject();

我设置数据:

myObject.next({id: 1, name: 'Jack'})

并像这样订阅这个主题:

myObject.subscribe((res)=> console.log(res))

但是我无法获取该主题的数据

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    尝试将其更改为 BehaviorSubject

    public myObject: BehaviorSubject<any> =
        new BehaviorSubject();
    

    【讨论】:

      【解决方案2】:

      [...] 或者我必须只使用行为主题?

      不仅如此,它还会对您的示例有所帮助。 BehaviorSubject 有一个状态,只要你订阅它,它就会立即发出状态,例如

      // set initial state in constructor.
      public myObject: Subject<any> = new BehaviorSubject({id: 1, name: 'Jack'});
      
      // calling next will also change the state
      myObject.next({id: 2, name: 'Jack-2'});
      
      // emits the state immediately at subscribe.
      myObject.subscribe((res)=> console.log(res))
      

      另一方面,普通的 Subject 不存储任何发射值。当你打电话给myObject.next({id: 1, name: 'Jack'}) 而没有人订阅myObject 时,发射就会丢失。

      【讨论】:

        【解决方案3】:

        SubjectBehaviorSubject 之间的区别很微妙,并且与订阅时刻有关。

        Subject 只会从订阅的那一刻起获得新值。
        BehaviourSubject 将在订阅时提供最后一个值和所有新值。
        还有一个 ReplaySubject 将在订阅时提供所有以前的值和所有新值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-21
          • 2020-06-06
          • 2021-09-09
          • 1970-01-01
          • 2011-03-30
          相关资源
          最近更新 更多