我想发送http请求,直到其中一个回复error 404
。
共有21页,我有类似的内容:
_getAll = function () {
var promises = [];
var pages = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];
angular.forEach(pages, function (page) {
var deffered = $q.defer();
$http({
url: 'http://api.tvmaze.com/shows?page=' + page,
method: 'GET'
}).
success(function (data) {
console.log("OK")
deffered.resolve(data);
}).
error(function (error) {
deffered.reject(error);
console.log(error.status);
});
promises.push(deffered.promise)
})
return $q.all(promises);
},
但如果我尝试获取http://api.tvmaze.com/shows?page=22,则会返回404 error
。
因此,有一个选项可以http
请求,直到其中一个返回404
。在循环或其他方式?
答案 0 :(得分:1)
这些调用是异步的,因此在您加载第一页之前,while循环会尝试在几秒内调用1000页。在加载下一页之前,您需要等待每个页面完成。
执行此操作的一种方法是创建一个函数来获取页面,并在每次成功加载页面时使用下一个页码触发它。一旦遇到错误,就会触发最终成功回调并将数据传回。
_getAll = function(callback) {
var pageData=[];
function getPage(page) {
$http({
url: 'http://api.tvmaze.com/shows?page=' + page,
method: 'GET'
}).
success(function (data) {
pageData.push(data);
//get next page
getPage(page + 1);
console.log("OK")
}).
error(function (error) {
//Hit an error. All done. Trigger callback.
callback(pageData);
console.log(error.status);
});
}
//get first page
getPage(0);
}
//usage:
_getAll(function(data){
//this function will trigger once we get an error
//data will be an array of all of the pages data
console.log(data);
});
答案 1 :(得分:0)
$q.all
将允许您执行此操作。以下是代码解释如下:
_getAll = function() {
var pages = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21];
return $q.all(pages.map(function(page) {
return $http({
url: 'http://api.tvmaze.com/shows?page=' + page,
method: 'GET'
})
.then(function(response) {
return response.data;
}, angular.noop);
}))
.then(function(data) {
data.pop();
return data;
});
};
注意,angular.noop
在then
回调各个请求中。它基本上是在没有更多页面时处理失败请求的方式(状态404)。当你到达这个错误回调(什么都不做),并且因为它什么都不做,这意味着你从错误情况中恢复,所有以前成功的请求数据将进一步传播。在链中的下一个then
,我们需要删除最后一个undefined
元素(angular.noop
为404页面返回的元素),以便生成的数据数组没有无意义的未定义值作为最后一个元素。