【发布时间】:2017-09-21 06:50:39
【问题描述】:
在我的 Angular 应用程序中,我正在处理通知,并且我有一个 REST API 来调用最新用户的通知。我需要在几分钟内调用此 API,因为用户实时获取通知并不重要(它们甚至可能不会出现得那么快)。然而,在客户端刷新通知的想法是下一个:
- 当用户登录时开始刷新通知 - 这是几分钟后开始刷新 API 的第一个手动调用
- 如果用户让应用保持打开状态或只是在应用中导航,则不要更改计时器并等待剩余时间
- 如果用户打开子页面可以执行与通知相关的操作并执行此操作,则刷新通知并重置计时器
- 在注销前刷新通知
我已经有了所描述过程的工作代码,但我不确定它是否适合我的需要。这是执行调用的代码(手动检查只有一个主题,停止检查有一个可观察的订阅 - 下面的代码实际上是分开的,但由于可读性,这里放在一个地方):
// Subject for manual triggering
this.checkFeed = new Subject<void>();
// Call for refresh in own method
this.checkFeed.next();
// Waiting for manual refresh or triggering it on some interval after it was last triggered
this.feedSub = this.checkFeed.asObservable()
.switchMap(() => Observable.timer(0, this.interval))
.mergeMap(() => this.fetchChanges())
.distinctUntilChanged(this.compareFeed)
.subscribe(res => this.notify(res));
// Unsubscription when logging out
if (this.feedSub) this.feedSub.unsubscribe();
我最不确定的部分是.switchMap(() => Observable.timer(0, this.interval)),因为它需要0 才能立即开始(这没关系,但看起来仍然不正确?)。那么有没有更好的方法来实现我所描述的?
我还有另一个问题,如何开始检查来自另一个 observable 的通知 - 我应该使用哪个运算符。正如我所提到的,我已经在自己的方法中调用了主题的下一个,如下所示:
refreshFeed(): void {
this.checkFeed.next();
}
因此,当有其他可观察到的执行(应刷新通知时的操作)时,我需要调用它。当其他 observable 有来自 API 的响应时,调用 void 方法的正确方法是什么?我在想这样的事情:
someActionThatCanChangeNotifications(): Observable<any> {
return this.api.get('path/to/endpoint')
.do(() => this.feedService.refreshFeed());
}
这样可以吗,还是有更好的办法?
提前感谢您的帮助!
【问题讨论】:
标签: notifications rxjs observable rxjs5 subject