Получить JSON на основе другого JSON в Angular Service

0

Я новичок в Angular, и я не уверен, как выполнить то, что кажется простой задачей. Я хочу получить файл JSON с помощью $ http.get, а затем использовать элементы из этого массива для создания URL-адреса для получения большего количества файлов JSON для отображения. Я знаю, что мой код неверен, но я думаю, что это помогает показать, чего я пытаюсь выполнить.

app.factory('posts', ['$http', function($http) {

  var topStor = $http.get('https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty');

  var stor = $http.get('https://hacker-news.firebaseio.com/v0/item/' 
    + topStor[0] + '.json?print=pretty');

  return stor

  .success(function(data) {
    return data;
  })
  .error(function(err) {
    return err;
  });
}]); 

3 ответа

0

Вы можете использовать $ q в ваших интересах здесь. Верните обещание, которое разрешается с данными, которые вы выполните:

    app.factory('posts', ['$http', '$q', function($http, $q) {

      function getStory() {
        var deferred = $q.defer();

        $http.get('https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty')
        .success(function(data, status, headers, config) {
          $http.get('https://hacker-news.firebaseio.com/v0/item/' 
            + data[0] + '.json?print=pretty')
            .success(function (data, status, headers, config) {
              deferred.resolve(data);
            })
            .error(function(data, status, headers, config) {
              deferred.reject('There was a problem getting the story');
            });
        })
        .error(function(data, status, headers, config) {
          deferred.reject('There was a problem getting the top stories');
        });

        return deferred.promise;
      }

      return {
        getStory: getStory
      }
    }]); 
0

Попробуй это:

app.factory('posts', ['$http', function($http) {

  var topStor = $http.get('https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty');
  return topStor
     .success(function(){
          var stor = $http.get('https://hacker-news.firebaseio.com/v0/item/' 
    + topStor[0] + '.json?print=pretty');

        return stor

         .success(function(data) {
            return data;
         })
         .error(function(err) {
            return err;
         });
      })
      .error(function(){

      });  
 }]); 
0

По умолчанию HTTP-запросы async. Угловая использует шаблон обещания для обработки асинхронного ответа от $http.

var topStor = $http.get(...); // topStor is now the promise and not the value

Метод success будет вызван по возвращенному обещанию, когда запрос будет успешным. Итак, чтобы получить массив из исходного запроса:

$http.get(URL).success(function(data, status) {
  // data is the array from the response
});

Затем вложенный запрос может быть получен из данных, полученных от исходного запроса.

$http.get(URL).success(function(data, status) {
  $http.get(UTL + data[0]).success(function(innerData, innerStatus) {
    // celebrate with innerData
  }).error(function(errData, errStatus) {});
}).error(function(errData, errStatus) {});

Примечание. success и error - это специальные методы, добавленные к службе $q которую использует Angular.

Поскольку возвращаемое значение вызова функции $ http является обещанием, вы также можете использовать метод then для регистрации обратных вызовов, и эти обратные вызовы получат один аргумент - объект, представляющий ответ. Дополнительную информацию см. В описании и подписи API.

Код состояния ответа от 200 до 299 считается статусом успеха и приведет к вызову обратного вызова успеха. Обратите внимание, что если ответ является перенаправлением, XMLHttpRequest будет прозрачно следовать ему, что означает, что обратный вызов ошибки не будет вызван для таких ответов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню