Ну так верните из вашей функции промис, который возвращает $http. Вообще так лучше не делать, а лучше явно объяслять данные и выносить запросы в сервисы, но в целях обучения можно на это закрыть глаза.
Если я правильно понимаю изначальную задачу, то лучше сделать так:
angular.module('app')
.controller('ProfileDetail', $scope, $http) {
$scope.$watch('selectedId', function (id) {
if (!id) {
$scope.data = {};
return;
}
var url = 'profile/?=' + id;
$http.get(url).then(function (response) {
$scope.data = response.data;
}, function () {
// обрабатывайте ошибки
})
});
})
<div ng-controller="ProfileDetail">
<div>
{{ data }}
/div>
<span class="btn" ng-click="selectedId = 4"></span>
</div>
Если же у вас данные просто должны быть инициализированы сразу по инициализации контроллера - ну так вызовите все прямо там. Не стоит вообще управлять загрузкой и вызывать методы какие-либо из шаблонов. Все зависит от задачи конечно, но мне сложно придумать кейс когда это нужно делать.