所以这是我的问题(我在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()
函数并在自己的函数中执行我的请求。在这个函数中,我尝试过使用:
所有解决方案的问题在于,异步,我最终收到响应,并且在我从服务器得到任何响应之前执行了$.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;
如前所述,我无法在论坛中找到解决问题的任何解决方案,但如果我可能忽略了某些内容,请以正确的方式指出我。
答案 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();