モジュールの 1 つに多数の繰り返しコードがあり、これをすべてのコントローラーから取り出す最善の方法について非常に混乱しています。ユーザー プロファイルのリストを管理するサービスがあります。これらはローカルの 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;
}
コントローラーをクリーンアップする最良の方法は何ですか?