Я новичок в 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;
});
}]);
Вы можете использовать $ 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
}
}]);
Попробуй это:
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(){
});
}]);
По умолчанию 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 будет прозрачно следовать ему, что означает, что обратный вызов ошибки не будет вызван для таких ответов.