2015-02-23 3 views
1

Я хочу загрузить файл JSON на завод и затем вернуть его значение.

Вот код:

angular.module('getGuilds', []) 
    .factory('getGuilds', getGuilds); 

getGuilds.$inject = ['$http']; 

function getGuilds($http){ 
    var obj = {content:null}; 

    $http.get('guild/guilds.json').success(function(data) { 
     obj.content = data; 
    }); 

    return obj; 
} 

Проблема заключается в том, что она только возвращает объект со значением нуль, так что кажется, что $ http.get не изменяет значение OBJ .content.

После этого я сделал небольшой тест:

$http.get('guild/guilds.json').success(function(data) { 
     obj.content = data; 
    }); 

    console.log(obj) 
    return obj; 
} 

Он дал назад этот объект InstEd массива в формате JSON в: {содержание: нулевой}.

Затем я помещал console.log в запрос $ http.get.

$http.get('guild/guilds.json').success(function(data) { 
    obj.content = data; 
    console.log(obj) 
}); 

Угадайте, что вышло из файла JSON. Кто-нибудь будет так добр, чтобы помочь мне?

ответ

3

$ http.get выполняет асинхронно. Код, который появляется после блока успеха в источнике, запускается перед кодом в блоке успеха. Таким образом, он ведет себя так, как ожидалось: с первой попытки вы регистрируете результаты незавершенного запроса.

2

Это потому, что $ http.get выполняет асинхронное получение. Поэтому в момент, когда вы назначали значение, оно еще не было доступно. Вы должны вернуть OBJ внутри вашей функции успеха изменения коды, как это должно заставить его работать:

// dataservice factory 
angular 
.module('getGuilds', []) 
.factory('dataservice', dataservice); 

dataservice.$inject = ['$http']; 

function dataservice($http) { 
    return { 
     getGuilds: getGuilds 
    }; 

    function getGuilds() { 
     return $http.get('guild/guilds.json') 
     .then(getGuildsComplete) 
     .catch(getGuildsFailed); 

     function getGuildsComplete(response) { 
     return response.data; 
     } 

     function getGuildsFailed(error) { 
     console.log('XHR Failed for getGuilds.' + error.data); 
     } 
    } 
} 

В контроллере вы бы затем вызвать DataService:

dataservice.getGuilds() 
    .then(function(data) { 
    vm.guilds = data; 
    return vm.guilds; 
    }); 

Очевидно, что контроллер требует больше коды на самом деле работать. Но это должно дать вам достаточно информации для решения вашей проблемы.

Смежные вопросы