Angular2:取消循环中的Http请求

时间:2017-05-24 19:16:16

标签: angular rxjs observable angular2-http angular2-observables

我通过遍历小工具进行了一系列Http调用。有没有办法中止所有请求

      for (let gadget of gadgets) {
               this.userService.getGadgetsData(gadget.Id, gadget.Name).subscribe(gadgetsData => {   
    });
}

我在component.service.ts中的服务代码

@Injectable()
export class UserService {
    constructor(public _http: Http) { }
 getGadgetsData() {

        return this._http.get(this._dashboards, { headers: this.getHeaders() })
            .map((res: Response) => res.json());
    }

}

2 个答案:

答案 0 :(得分:5)

请查看这是否是您想要的。

observableList: [];

......

for (let gadget of gadgets) {
    let obs = this.userService.getGadgetsData(gadget.Id, gadget.Name).subscribe(gadgetsData => {
    });
    this.observableList.push(obs);
}

...
onClick() {
    for (let i = 0; i < this.observableList.length; i++) {
        this.observableList[i].unsubscribe();
    }
}

答案 1 :(得分:0)

您可以为您的请求添加超时,然后从您的observable中添加unsubscribe

注意:由于您的示例代码,我假设您正在使用RxJ和Observable。

如果你有一个click事件,你可以保存对所有observable(inside your loop)的引用并将它们放在一个列表中,然后在你的函数内部(例如onClick())遍历该列表来自你所有观察者的unsubscribe

    var myObservable = this.userService.getGadgetsData(gadget.Id, gadget.Name)
          .subscribe(gadgetsData => {});

    //later on your code, maybe on your click event

    myObservable.unsubscribe();

来自github文档:unsubscribesubscribe

努力做到彻底:

您还可以将Observable添加到其他Observable中,这样当您取消订阅main(parent)observable时,其中包含的所有observable也将取消订阅。您可以使用Observable对象中包含的方法addremove来实现它。

可能有更好的方法可以做到这一点,但这是我的头脑。