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

Prevent service from multiple server loads

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

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 个不同的控制器时,它们都从服务器获取变量值。 我正在尝试保存承诺,如果请求在解决时已经在处理 whait 并且不创建新的。 现在使用我在控制器中发布的代码

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

永远不要进入回调函数。 如果它很重要,我使用版本:angular 库的“1.5.8”。

你们可以分享同一个承诺。另请注意,$http 已经 return 承诺,因此使用 $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;
}

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