每10秒运行一次API调用

时间:2016-08-26 19:28:18

标签: angular

我有以下方法返回一个observable:

getWhatsUp() {
    return this.http.get('user/whatsUp?token=' + this.getToken())
                  .map((res:Response) => res.json())
                 .catch(
        err => {
            this.checkToken(err);
            return Observable.throw('Unverified token');
            }
      );
}

我通过以下方式在我的组件中使用它:

ngOnInit() {
this.getWhatsUp();
}

getWhatsUp() {
    this.service.getWhatsUp()
                   .subscribe(
                     data => {
                        this.activities = data.activities;
                     },
                     error => { console.log("Error #333"); }
                     );
  }

如何每隔10秒运行一次以更新活动并确保api调用不会堆叠并多次运行?

我了解interval方法,但我不确定如何在我的设置中使用它

4 个答案:

答案 0 :(得分:4)

为什么不呢:

ngOnInit() {
    setInterval(() => this.getWhatsUp, 10000);
}

如果您需要有关语法的更多信息,请使用ES6 Arrow function again

答案 1 :(得分:1)

RxJS方式

ngOnInit(){
  let sec = 10;
  Observable.timer(0, sec * 1000).subscribe(this.getWhatsUp());
}

答案 2 :(得分:0)

一种可能的解决方案是创建一个附加函数作为包含setInterval的处理程序。 setInterval(myTimer,10000)

<div class="col-sm-3"></div>
              <div class="col-sm-2">
                <div class="checkbox-inline">
                  <label class="checkbox-inline"><input type="checkbox" value="">Adult News</label>
                </div>
              </div>
              <div class="row checkbox-row">
                <div>
                  <div class="checkbox-inline">
                    <label class="checkbox-inline"><input type="checkbox" value="">Youth News</label>
                  </div>
                </div>
              </div>
            </div>
</div>

答案 3 :(得分:-2)

更好的解决方案是使用角度提供者 $ interval $ destroy

示例:由于此解决方案会破坏呼叫,如果当前状态/控制器已更改

var stop=$interval(function () {
            function_call();
        }, 12000)

        $scope.stopInterval = function () {
            if (angular.isDefined(stop)) {
                $interval.cancel(stop);
                stop = undefined;
            }
        };

        $scope.$on('$destroy', function () {
            // Make sure that the interval is destroyed too
            $scope.stopInterval();
        });