内部循环中的Ajax请求数量未知

时间:2015-03-03 09:37:20

标签: javascript jquery ajax

所以这是我的问题(我在stackOverflow上尝试了几个建议):

方案

我正在使用Gitlab API,我想列出所有"问题"对于给定项目,系统上存在的错误跟踪器。


问题

这一切都很好,但是有一个分页系统可以做到这一点,因为ajax请求者每个响应限制为100个条目。

所以我必须做这样的事情:

$.ajax({
    url: "https://mygitlabURL/api/v3/projects/97/issues",
    type: "GET",
    data: {
        private_token: "mytoken",
        per_page: 100,
        page: 1
    }

这将给我100个条目。我需要做的是将这些条目添加到列表中,并检查:"响应中的条目少于100个?"如果是这样,我可以停止提出请求。

然后我需要获得完整列表才能继续使用我的代码,所以我尝试使用$.when()函数并在自己的函数中执行我的请求。在这个函数中,我尝试过使用:

  • 关闭,例如this answer
  • 递归,如另一个答案所建议的(没有链接)
  • while loop 因为,哦,好吧,为什么不

所有解决方案的问题在于,异步,我最终收到响应,并且在我从服务器得到任何响应之前执行了$.when()函数。

有办法做到这一点吗?

这是我尝试的最新代码(带递归):

$(function () {
    $("button").on("click", function () {
        $.when(func1(), func2()).then(finishedFunc);
    });
});

var func1 = function (pageNr) {
    pageNr = pageNr || 1;

    megaList = [];
    // Get server values
    $.ajax({
        url: "https://mygitlabURL/api/v3/projects/97/issues",
        type: "GET",
        data: {
            private_token: "myToken",
            per_page: 100,
            page: pageNr
        },
        success: function (issuesList) {
            console.log("Page number: " + pageNr);

            megaList = [pageNr];

            if (issuesList.length < 100) {
                return megaList;
            }

            pageNr = pageNr +1 ;
            var received = func1(pageNr);
            megaList = $.merge(megaList, received);

            return megaList;
        }
    });
  }

var func2 = function () { 
    return 20;
}

var finishedFunc = function (resp1, resp2) {
    console.log("Responses were resp1: " + resp1 + " and resp2: " + resp2);
}

我总是这样: &#34;回复是resp1:undefined和resp2:20&#34;

我期待的是: &#34;回复是resp1:[1,2,3,4,5,...,27]和resp2:20&#34;

如前所述,我无法在论坛中找到解决问题的任何解决方案,但如果我可能忽略了某些内容,请以正确的方式指出我。

2 个答案:

答案 0 :(得分:1)

在阅读文档时。我遇到了这个问题。 分页

列出资源时,您可以传递以下参数:

page (default: 1) - page number
per_page (default: 20, max: 100) - number of items to list per page
每次回复都会发回

Link headers。它们具有rel prev / next / first / last并包含相关的URL。请使用这些而不是生成您自己的网址。

它自动表示返回的响应将包含 rel prev / next / first / last。因此,您可以轻松检查链接标头是否包含下一个rel,如果包含,则直接调用该URL以查找更多问题,如果不是这意味着它不包含更多问题。

答案 1 :(得分:1)

一旦开始用async术语思考,解决方案变得非常简单:

var megaList = [];
function loadList(page) {
    page = Math.max(1, page);
    $.ajax({
        url: "https://mygitlabURL/api/v3/projects/97/issues",
        type: "GET",
        data: {
            private_token: "myToken",
            per_page: 100,
            page: page
        },
        success: function (issuesList) {
            console.log("Page number: " + page);
            megaList = megaList.concat(issuesList);
            if (issuesList.length >= 100) loadList(page+1);
        }
    });
}
loadList();