0

我的一个模块中有一堆重复的代码,我对从所有控制器中获取它的最佳方法感到非常困惑。我有一项管理用户配置文件列表的服务。这些存储在本地的 sessionStorage 中,但如果它为空,则服务会对 API 进行 $http 调用,然后缓存结果。用户可以输入几个不同页面之一,因此我需要确保在显示屏幕之前加载数据。我使用 $modal 弹出一个框,说它正在加载配置文件,而配置文件服务正在考虑它。如果是在sessionStorage中,就是一眨眼;如果它必须进行 API 调用,它会在此过程中等待几秒钟。

这是我的控制器中的重复代码:

var modal = $modal.open({ templateUrl: 'template/modal/loadingProfile.html' });
  profileService.getUserBySequence($routeParams.sequence).then(function (data) {
    $scope.user = data;
    profileService.getProfileForUser($scope.user.Sequence).then(function (data) {
      var stop = $timeout(function () {
      if (modal.opened) {
        modal.close();
        $timeout.cancel(stop);
      }
    }, 100);
    $scope.profile = data;
  });
});

在每个控制器的顶部都有这不是很愉快。下面看一下配置文件服务:

function getUserBySequence(sequence) {
    var defer = $q.defer();
    getUserList().then(function (data) {
        defer.resolve(data['_' + sequence]);
    }, function(result) {
        alertService.show(result.data.flash);
        defer.reject();
    });
    return defer.promise;
}

function getUserProfile(sequence) {
 var defer = $q.defer();
 var profile = sessionService.get('profile.' + sequence, true);
 if (profile) {
    defer.resolve(profile);
 } else {
    var companyId = sessionService.get('companyId');
    $http.get("http://domain.com/api/getProfile?id=" + companyId + "&sequence=" + sequence).then(function (result) {

       // only parse if a string
       if (typeof result.data == "string") {
          profile = JSON.parse(result.data);
       } else {
          profile = result.data;
       }

       sessionService.set('profile.' + sequence, profile, true);
       defer.resolve(profile);
    }, function (result) {
       sessionService.unset('profile.' + sequence);
       alertService.show(result.data.flash);
       defer.reject();
    });
 }
 return defer.promise;
}

清理控制器的最佳方法是什么?

4

0 回答 0