【问题标题】:Angular BehaviorSubject returns initial value when subscribing after setting next valueAngular BehaviorSubject 在设置下一个值后订阅时返回初始值
【发布时间】:2020-06-07 23:40:15
【问题描述】:

我确实有以下服务:

export class TestService {

  constructor() { }

  private _schema = new BehaviorSubject("User");
  currentSchema = this._schema.asObservable();

  setSchema(schema: string) {
    this._schema.next(schema);
  }
}

当我订阅 observable 并在订阅后更改值时,一切正常,但是当我在更改值后订阅另一个组件时,我收到的是初始值而不是新的设置值。

因此,当我订阅 ngOnInit() 中的 observable 并在同一组件中设置下一个值时,它会起作用。但我想在稍后创建的另一个组件中接收下一个值。

我正在使用这样的服务:

ngOnInit() {

    this.testService.currentSchema.subscribe(x => {
      console.log('DETAIL >> ' + x);
    });
}

我不知道为什么会发生这种情况,因为 BehaviorSubjects 的感觉即使在订阅后也能获得价值。

【问题讨论】:

  • 听起来您的组件正在使用不同的服务实例。服务是否设置在任一组件的 providers 数组中?你能在 stackblitz 中提供一个现场演示吗?
  • 是的,服务设置在app.module.ts的providers数组中
  • 能否提供现场演示。
  • 您的代码应该与BehaviorSubject 一起使用,问题可能出在setSchema() 函数在ngOnInit() 运行后被调用
  • 我刚刚建立了一个演示项目,一切正常。我不知道我的问题出在哪里。一个组件必须使用该服务的另一个实例,但我不知道为什么会这样。

标签: angular observable behaviorsubject


【解决方案1】:

问题似乎出在组件本身。我从来没有想过这是组件的问题,所以我尝试了一切,从创建新服务、全新的 testapp 等。

当我尝试创建一个新组件来使用该服务时,它起作用了。我无法真正弄清楚导致旧组件出现问题的原因,我只是将代码 1 到 1 复制到新组件,但它突然就起作用了。

【讨论】:

    【解决方案2】:

    你可以使用 AsyncSubject 代替 BehaviorSubject 这样的

    private _schema = new AsyncSubject();
    

    AsyncSubject 是一个Subject 变体,其中只有 Observable 执行的最后一个值被发送给它的订阅者

    这是一个例子Example

    所以你的代码将是

    export class TestService {
    
      constructor() { }
    
      _schema = new AsyncSubject();
    
    
      setSchema(schema: string) {
        this._schema.next(schema);
      }
    
       getSchema(){
          return this._schema;
      }
    }
    

    【讨论】:

    • 谢谢你的回答,但这与我的问题无关。
    猜你喜欢
    • 1970-01-01
    • 2021-05-01
    • 2021-07-16
    • 2018-09-04
    • 1970-01-01
    • 2018-09-11
    • 2022-09-23
    • 2018-11-23
    • 2020-03-15
    相关资源
    最近更新 更多