【问题标题】:Angular rxjs interval not subscribing角度 rxjs 间隔未订阅
【发布时间】:2021-05-28 00:44:13
【问题描述】:

我有这段代码:

interval(180000).pipe(takeUntil(this._unsub$)).subscribe(() => myFunc())

_unsub$ 是在 ngOnDestroy 方法中触发的主题。 我的问题是 myFunc 永远不会被执行。

另一个组件中的同一段代码可以工作。我不明白为什么。

timer(0, 180000).pipe(takeUntil(this._unsub$)).subscribe(() => myFunc())

有效。 我对计时器的问题是,即使我调用,有时也会调用该函数

ngOnDestroy() {
   this._unsub$.next();
   this._unsub$.complete();
}

你猜为什么会这样?

【问题讨论】:

  • 你是说myFunc 里面的interval() 根本不会触发,即使在等待 3 分钟之后?
  • 没错,这是我的问题。我总是这样使用间隔,它一直有效
  • 您是否尝试在_unsub$ 发出时注销以确保它不会导致您的订阅提前结束?

标签: angular rxjs intervals subscription


【解决方案1】:

interval 和 timer 都是冷的 observables,并且 observables 是惰性的(与 promises 不同),因此在您订阅之前不会调用您的计时器,并且在您订阅时会创建一个新的计时器。

这两个设置是一样的:

const firstFunc = () => ...
const secondFunc = () => ...
const interval1$ = interval(180000).pipe(takeUntil(this._unsub$));
const interval2$ = interval(180000).pipe(takeUntil(this._unsub$));
interval1$.subscribe(firstFunc);
interval2$.subscribe(secondFunc);
const firstFunc = () => ...
const secondFunc = () => ...
const interval$ = interval(180000).pipe(takeUntil(this._unsub$));
interval$.subscribe(firstFunc);
interval$.subscribe(secondFunc);

所以你必须考虑何时调用.subscribe。这是我解释不同组件中非常相似的代码之间差异的最佳猜测。如果在订阅定时器之前调用了this._unsub$.next();,那么在 180 秒后,定时器仍然会触发,因为它从未收到 _unsub$ 信号。

【讨论】:

  • 我在 ngOnInit 函数中立即订阅 observable。我在 ngOnDestroy 中调用 _unsub$.next()。所以即使在 _unsub$.next() 之后计时器也会触发事件,因为它已被安排但不会触发下一个?目前我让我的代码工作的唯一方法是在 ngOnDestroy 中使用 js setInterval() 和 closeIntervals,因为间隔不会触发它的功能
猜你喜欢
  • 2021-10-17
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 2020-03-08
相关资源
最近更新 更多