【问题标题】:How to fire .next() for the second time in rxjs async subject?如何在 rxjs 异步主题中第二次触发 .next()?
【发布时间】:2016-04-04 14:06:44
【问题描述】:

我有一个包含两个按钮的组件。当我根据下面给定 plunker 中的演示单击第一个按钮时,它会发出一个事件,我的服务函数会发出一个带有一些值的异步主题...当我点击另一个按钮我试图再次调用 .next 事件,但它抛出了一些错误...我在这里做了一个 pluker 演示 http://plnkr.co/edit/wpyV7o9JErdQMzGFZ4wp?p=preview ...如果我使用主题它工作正常但我不想在这种情况下使用主题...

export class ErrorService{
  latestError:AsyncSubject<string> = new AsyncSubject();

  Save() {
    this.latestError.next('form submitted');
    this.latestError.complete();
  }

  Update(){
    this.latestError.next('form updated');
    this.latestError.complete();
  }
}

这是我的服务类,这就是我为异步主题调用 .next 事件的方式。

  this.service.latestError.subscribe(
err=> {
  console.log('result = '+err);
  this.result=err;
},
err => {
  console.log('err');
},
() => {
  console.log('complete');
});

这就是我订阅异步主题的方式...单击事件第一次正常工作,但是当我单击另一个按钮时它会引发错误。请有人帮我解决这个错误...我该怎么做使用我的异步主题第二次调用 .next()...在此先感谢

【问题讨论】:

    标签: angular rxjs5


    【解决方案1】:

    试试这个

    this.service.latestError.subscribe(
    err=> {
      this.service.latestError = new AsyncSubject(); // this set isStopped property to false again
      console.log('result = '+err);
      this.result=err;
    },
    err => {
      console.log('err');
    },
    () => {
      console.log('complete');
    });
    

    【讨论】:

      【解决方案2】:

      这是因为您在主题上调用了complete 方法。它结束了数据流链,你不能再接收事件了。

      【讨论】:

      • 如果我不调用完整方法,即使我第一次单击按钮,它也不会发出任何值...是否有任何其他替代方法可以在每次使用异步主题调用 .next() 时发出数据?
      • 您的用例是什么?是否需要使用 AsyncSubject 类?
      • 是的,因为我正在使用 DCL 动态加载组件并使用相同的按钮单击事件进行服务调用。如果我使用主题,则在加载组件时会执行 .next() 语句,因此在我的情况下我必须使用异步
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 2017-02-15
      • 2018-09-30
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多