重复HTTP请求,直到返回404错误

时间:2015-10-03 08:51:45

标签: javascript angularjs http

我想发送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。在循环或其他方式?

2 个答案:

答案 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.noopthen回调各个请求中。它基本上是在没有更多页面时处理失败请求的方式(状态404)。当你到达这个错误回调(什么都不做),并且因为它什么都不做,这意味着你从错误情况中恢复,所有以前成功的请求数据将进一步传播。在链中的下一个then,我们需要删除最后一个undefined元素(angular.noop为404页面返回的元素),以便生成的数据数组没有无意义的未定义值作为最后一个元素。

演示: http://plnkr.co/edit/CR711Js1KvrvnvKDonXK?p=preview