2015-06-07 2 views
2

Моего кода:

$rootScope.getResource = function(id) { 
    $http.get("path/of/resource/" + id) 
    .success(function (data, status, header, config) { 
    return data; 
    }) 
    .error(function (data, status, header, config) { 
    console.log("Error"); 
    }); 

Но он всегда возвращает «неопределенный».

Я знаю, проблема в том, что функция $ http является асинхронной, и я должен использовать обещания, но я не могу понять, как делать все внутри только функции в $ rootScope.

+0

Можете ли вы рассказать о своей проблеме – shreyansh

+3

Вернуть обещание: 'return $ http.get (" путь/ресурс/"+ id);'. Прочтите http://blog.ninja-squad.com/2015/05/28/angularjs-promises/ –

+1

Почему вы подключаете getResource к $ rootScope? Вы должны использовать фабрику. – Donal

ответ

0

Вы должны вернуть данные с обратным вызовом.

$rootScope.getResource = function(id, callback) { 

    var cb = callback || angular.noop; 

    $http.get("path/of/resource/" + id) 
    .success(function (data, status, header, config) { 
    return cb(data); 
    }) 
    .error(function (data, status, header, config) { 
    console.log("Error"); 
    return cb('error'); 
    }); 

Затем, чтобы использовать обновленный getResource функции

$scope.assignReturnedData = $rootScope.getResource(15, function(data) { 
    $scope.yourVariable = data; 
}); 

Вы можете получить идею от этого работать plunker.

Одностороннее примечание, я бы не рекомендовал вам использовать $rootScope для получения данных, вместо этого вы должны изучить использование angular service.

+3

Это анти-шаблон. Вместо этого OP должен вернуть обещание. Это позволило бы вызывающему пользователю делать все, что захочет, в случае успеха, и что бы он ни пожелал в случае ошибки. 'return $ http.get (« путь/of/resource/»+ id) - это все, что вам нужно. Если вы действительно хотите войти в систему в случае ошибки, используйте «return $ http.get» (путь/of/resource/«+ id) .catch (function (r) {console.log ('error'); return $ q.reject (r);}); –