【问题标题】:Angular 2 updating an observableAngular 2 更新一个 observable
【发布时间】:2016-06-26 19:33:10
【问题描述】:

我正在使用以下方法来创建一个可观察的以每 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。

我的问题:如何在 observable 下次运行的剩余时间尚未过去的情况下执行 observable API 调用?

【问题讨论】:

    标签: angular


    【解决方案1】:

    您需要合并 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()
    

    【讨论】:

    • 我没有收到"// you need to convert user activity to an observable"。你是什​​么意思?它会重置 5 秒的“冷却时间”吗? (这意味着如果手动执行了 observable,它将重新计算 5 秒)
    • 您可以像第二部分一样使用主题。不,它不会重置 5s 计时器。如果您需要在每个http.get('user-activity') 上重置计时器,请告诉我。不过会有点复杂
    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多