2014-11-05 3 views
0

Я пробовал создать службу, которая будет получать данные из локального файла JSON, но она не работает, и нет объяснений, почему нет.Угловое обслуживание для получения JSON из локального файла не работает

plunkr is here. Вот мой код для службы:

webTestApp.factory('webtest', function($q, $timeout, $http) { 
    var Webtest = { 
     fetch: function(callback) { 
      var ret = function() { 
       $http.get('webtest.json').success(function(data) { 
        return data; 
       }); 
      }; 

      return ret(); 
     } 
    }; 
    return Webtest; 
}); 

Plunkr выше именно то, что я делал в моем проекте, но я раздвоенный another Plunkr, где кто-то получили такие же вещь работали. Я нашел его в этом StackOverflow answer.

Вот рабочая версия

webTestApp.factory('webtest', function($q, $timeout, $http) { 
    var Webtest = { 
     fetch: function(callback) { 

      var deferred = $q.defer(); 

      $timeout(function() { 
       $http.get('webtest.json').success(function(data) { 
        deferred.resolve(data); 
       }); 
      }, 30); 

      return deferred.promise; 
     } 
    }; 

    return Webtest; 
}); 

Мой вопрос, почему моя версия (первый блок) не работает, а второй один делает?

+2

потому что вы не возвращаете обещание от функции: 'return $ http.get ....' –

ответ

1

Вы смущаете его функцией ret. Вот упрощенная версия кода, где я просто вернуть обещание, что $ HTTP вызов возвращает: http://plnkr.co/edit/9VaqIuOVHyMI12Z0r3jm?p=preview

Чтобы получить версию для работы, ваша ret функция должна вернуть что-то ($ HTTP является асинхронной вызов, так что Безразлично «имеет значение его успех на самом деле обратное вызов возвращает что-то):

 var ret = function() { 
      return $http.get('webtest.json').success(function(data) { 
     // this ^^ is the key 
       return data; 
      }); 
     }; 

Затем, когда $ HTTP обещания решить, фактическое содержание данных в response.data, а не только response (полный response фактически содержит заголовки и другие созывающий сервер). Вот ваша оригинальная версия с этими двумя исправлениями: http://plnkr.co/edit/mzsdTFWr3qAXGfizjRRC?p=preview

Это второй пример, который вы написали работы, потому что он возвращает простой $ Q обещание (поэтому $scope.data работы и $scope.data.data не требуется), но она представляет собой antipattern, так что вы должны придерживайтесь своего первоначального подхода (или используйте упрощенную версию, которую я дал вам в первом абзаце).

+0

huh? Поэтому, если я добавлю 'return' перед' $ http.get ... ', он должен работать? Я попытался, но он все еще не работает. – CodyBugstein

+0

Как я уже сказал, нужно исправить две вещи: 'return' и' response.data' (в вашем случае '$ scope.data.data'). Он явно работает в моем плункере: http://plnkr.co/edit/mzsdTFWr3qAXGfizjRRC?p=preview. Обещание, полученное при вызове $ http, немного отличается от обещания в $ q. – Shomz

+0

Ah так '$ http.get (..). Success (function (..) {..});' возвращает объект ответа с прикрепленным объектом данных? – CodyBugstein

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