Angular2使用setInterval()防止.push()中元素的重复

时间:2016-11-29 11:09:53

标签: javascript angular

我在setInterval()上触发一个功能,基本上每30秒进行一次HTTP GET次呼叫,但是每次触发它时都会重复数据,因为它们在数组中被推送。

for()的想法是查找状态为objects的每个AwaitingPicking and AwaitingCollection,然后将其推送到各自的array

private awaitingPicking: any = [];
private awaitingCollection: any = [];

constructor(private sharedService: SharedService, private http: Http) {
    setInterval(() => {
      this.getOrdersFromOrigin();
    }, 10000);
  }

getOrdersFromOrigin() {
    this.isLoading = true;
    this.sharedService.getOriginSite()
      .subscribe(data => {
        this.isLoading = false;

        for (var i = 0; i < data.Results.length; i++) {
          var element = data.Results[i];
          if (element.OrderLineGroups[0] && element.OrderLineGroups[0].Status == 'AwaitingPicking') {
              this.awaitingPicking.push(element);
          } else if (element.OrderLineGroups[0] && element.OrderLineGroups[0].Status == "AwaitingCollection") {
            this.awaitingCollection.push(element);
          }
        }

      },
      err => {
        this.isLoading = false;
      });
  }

每次setInterval()触发时,有没有办法防止数据重复?

我尝试过类似下面的代码,但它仍然复制元素。

if(this.awaitingPicking.indexOf(element) === -1){
  this.awaitingPicking.push(element);
}

1 个答案:

答案 0 :(得分:1)

只推动等待采摘&#34;和等待收集&#34;等待收集&#34;数组如果元素不存在。参见例如the answer to this question有一种方法可以做到这一点(你需要对当前的打字稿进行重构)。

例如,你可以在你的类中添加类似下面的东西(你还需要为awaitingCollection实现这个):

private pushAwaitingPickingIfNew(element: any): void {
    if(!this.awaitingPicking.some(a => a == element)) {
        this.awaitingPicking.push(element);
    }
}

然后替换

this.awaitingPicking.push(element)

this.pushAwaitingPickingIfNew(element);