防止来自多个服务器负载的服务

时间:2016-09-26 12:51:13

标签: angularjs deferred

我有一个角色服务MyService 里面有get方法。它从服务器获取信息,如果变量未定义则将其设置为局部变量,overwise返回变量

export class MyService{
    private userSettings: UserSettings;
    private updateProcessing: boolean = false;
    private deferred : any;

    constructor(
        private $http: ng.IHttpService,
        private $q: ng.IQService,
        private $log: ng.ILogService) {
    }


    public get(fromServer: boolean = false) {
        var self = this;

        if (self.updateProcessing) {
            return self.deferred.promise;
        }
        else if (!self.userSettings || fromServer) {
            return self.getFromServer();
        } else
            return self.$q.resolve(self.userSettings);
    }

    private getFromServer(): ng.IPromise<any> {
        var self = this;
        self.updateProcessing = true;
        self.deferred = self.$q.defer();
        var url = self.getSettingsUrl();

        self.$http.get(url).then(
            (result: any) => {
                self.userSettings = result.data;
                self.updateProcessing = false;
                self.deferred.resolve(result.data);
            },
            error => {
                this.$log.error(error);
                self.updateProcessing = false;
                self.deferred.reject(error);
            }
        );

        return self.deferred.promise;
    }
}

当我将此服务传递给3个不同的控制器时,它们都从服务器获取变量值。 我试图保存承诺,如果请求在结算并且不创建新请求时已经在进行。 现在我发布了我在控制器中发布的代码

this.MyService.get().then(()=>{
});

并且永远不会进入内部然后回调。 如果它很重要,我会使用版本:&#34; 1.5.8&#34;角度图书馆。

1 个答案:

答案 0 :(得分:2)

您可以分享相同的承诺。另请注意,$http已经返回了承诺,因此使用$q创建新版本是一种反模式

private getFromServer(): ng.IPromise < any > {
  var self = this;
  self.updateProcessing = true;
  // if promise not stored need to create it
  if (!self.storedPromise) {    
    var url = self.getSettingsUrl();    
    self.storedPromise = self.$http.get(url).then(
      (result: any) => {
        self.userSettings = result.data;
        self.updateProcessing = false;
        return self.userSettings;
      },
      catch => {
        this.$log.error(error);
        self.updateProcessing = false;
        return self.$q.reject(error);
      }
    );
  }
  // return the stored promise
  return self.storedPromise;
}

现在,对此方法的第一次调用将创建承诺,后续调用将返回相同的