【问题标题】:Angular2 - Repeat a call of a serviceAngular2 - 重复调用服务
【发布时间】:2016-10-20 14:29:14
【问题描述】:

我有一个从服务器检索数据的服务。此数据用于填充页面。我想每 5 秒刷新一次页面。我尝试了一个非常简单的setInterval(),但随后对服务器的所有调用都是一个接一个,而无需等待前一个调用完成。例如,当服务器出现故障时,这是一个问题。我现在不知道哪个是最好的解决方案,可能是 rxjs 和 observables。

【问题讨论】:

    标签: angular typescript rxjs angular2-observables


    【解决方案1】:

    你可以做这样简单的事情:

    Rx.Observable.interval(5000)
      .flatMap(() => this.http.whateverYouCall)
      .map(resp => resp.json())
      .subscribe((val) => //do something here with the result)
    

    这将每 5 秒拨打一个新电话。如果您真的只想在前一个呼叫后 5 秒创建一个新呼叫,请告诉我,我会更新此呼叫。

    如果您只想在上一个通话结束后开始下一个通话,您可以这样做:

    let subject$ = new Rx.BehaviorSubject("a");
    
    subject$
      .concatMap(() => fakeHttp().concat(Rx.Observable.empty().delay(5000)))
      .do(() => subject$.next("a"))
      .subscribe((val) => console.log(val));
    

    jsbin:http://jsbin.com/fufuqid/13/edit?js,console 您会看到每 7 秒记录一次“b”。模拟调用 2 秒,刷新前 5 秒。

    【讨论】:

    • 是的,请......我希望下一个电话只有在前一个电话完成后才开始
    • 停止/重新启动轮询的方法是什么?通常我会使用.takeUntil(this.ngUnsubscribe),其中ngUnsubscribe 将是一个空主题,即.next().complete()。然而,在这种情况下,完成一个主题什么都不做。我在concatMap() 之前和fakeHttp() 之后尝试了takeUntil(),但这些都不会停止订阅。 ://
    猜你喜欢
    • 2016-04-13
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多