Angular 2更新了一个可观察的

时间:2016-06-25 12:11:12

标签: angular

我正在使用以下方法创建一个可观察的,每5秒运行一次API调用并检查新的用户活动:

getLastActivity()
{
    return Observable.interval(5000).startWith(0)
        .switchMap(() => this.http.get('user-activity'))
        .map(res => res.json());
}

我在显示活动的组件中订阅它,这是我的侧边栏(所有页面)。

let activitySub = this._myService.getLastActivity()
        .subscribe( data => this.activities = data.user_activities);

有时用户正在进行活动,我想在sidenav中显示新添加的活动,而不是等待1-5秒(可观察时间)。

将对象push手动添加到活动对象数组中的操作不是一个选项,因为这些操作是在服务器端插入的。

当我试图跑步时:

this.getLastActivity.subscribe(() =>{});

我收到了一个错误,因为我已经订阅了这个observable。

我的问题:我是如何执行可观察的API调用的,即使可观察的下一次运行的时间尚未过去?

1 个答案:

答案 0 :(得分:0)

你需要合并2个observable:“interval”observable和“user activity”observable。

let intervalOb = Observable.interval(5000).startWith(0);
let useractivityOb = ... // you need to convert user activity to an observable
Observable.merge(intervalOb, useractivityOb)
    .switchMap(() => this.http.get('user-activity'))
    .map(res => res.json());

或者您可以使用主题:

let subject = new Subject();
subject.switchMap(() => this.http.get('user-activity'))
    .map(res => res.json());
Observable.interval(5000).startWith(0).subscribe(subject);
// and now everytime there is a user activity, call subject.next()