取消销毁组件的本地请求

时间:2018-11-14 10:30:51

标签: angularjs

考虑您有一些组成部分,例如将GET请求发送到服务器的自动完成功能:

...
someObject = create();
vm.search = someFactory.getHttp(params).then(result => {
  someObjet.prop = result;
});

vm.$onDestroy = () => {
  someObject = null;
}

如果在请求挂起时销毁了组件,则回调将引发js错误。 我知道在这个具体示例中,我可以使用简单的If来解决此问题,但是显然可以取消此请求:

var canceler = $q.defer();
vm.search = someFactory.getHttp(params, canceler)...

vm.$onDestroy = () => {
      canceler.resolve();
      someObject = null;
}

这很好用,但是在每个组件中都有这样的代码似乎很奇怪。我想要类似的东西:

vm.search = someFactory.getHttp(params, $scope.destroyPromise)

但是这种东西似乎不存在...

问题:是否有任何简单的方法可以取消销毁组件的请求? 无论是在Angularjs还是在Angular

2 个答案:

答案 0 :(得分:0)

我在Angular中所做的一件事是使用RXjs进行请求,使用订阅,并将这些订阅添加到我们迭代并在销毁时取消的数组中,如下所示:

import { Component, OnInit, OnDestroy} from "@angular/core";
import { ActivatedRoute }              from "@angular/router";

export class AppComponent implements OnInit, OnDestroy {
    private subscriptions = [];

    constructor(private route AppRoute) {}

    ngOnInit() {
        this.subscriptions.push(this.route.data.subscribe());
    }

    ngOnDestroy() {
        for (let subscription of this.subscriptions) {
            subscription.unsubscribe();
        }
    }
}

答案 1 :(得分:0)

为什么不将创建的对象分配给不会被破坏的对象?这样可以保持您的行为,并且您可以进行简单的检查以防止出现任何错误。

...
var baseObj = {};
baseObj.someObject = create();
vm.search = someFactory.getHttp(params).then(result => {
    if (baseObj.someObject != null) {
        baseObj.someObjet.prop = result;
    }
});

vm.$onDestroy = () => {
  baseObj.someObject = null;
}