我正在尝试获取GitLab(不是GitHub!)项目的所有代码段的列表。 GitLab API提供的功能可让我每个呼叫最多收集100个摘要,而其他链接(next
,prev
,first
和last
则提供链接标题页(see this part of GitLab API)。
执行异步jQuery.get调用所有页面然后将所有结果传递到单个回调函数中的最佳方法是什么?
我提出的两个想法都不是很吸引人:
对第一页进行虚拟调用以获取总页数(getResponseHeader中的X-Total-Pages
),然后生成所有jQuery.get
,并将它们传递给jQuery.when
。还不错,但是浪费了首页的呼叫。
在while循环中运行jQuery.get
,并在每个全局变量上启动回调之前,让每个变量将其数据存储到某个全局变量中。缺点是调用不能并行运行,并且全局变量看起来不是干净的解决方案。
因为我认为这应该是一个普遍的问题,所以我希望在某个地方有一个干净的解决方案?
编辑
这是第一个想法的实现,以说明我要的内容,即如何避免不使用其结果的第一个$.getJSON
调用?
function getAllSnippets(callback){
//Make a dummy call to get number of pages
data = {"private_token": "my_private_token", "per_page": 100, "page":1}
$.when(
$.getJSON("https://myserver/api/snippets",data)
).then(function( data, textStatus, jqXHR ) {
//Get the number of pages
numPages = jqXHR.getResponseHeader('X-Total-Pages')
console.log(numPages+' pages in total')
//Generate queries for each new page
var promises = [];
for (var iPage = 1; iPage < numPages+1; iPage++) {
data = {"private_token": "my_private_token", "per_page": 100, "page":iPage}
promises.push($.getJSON("https://myserver/api/snippets",data));
}
//Collect and merge results from all calls
Promise.all(promises).then(function(results) {
answers = []
for (var iPage = 0; iPage < numPages; iPage++){
answers = $.merge( answers, results[iPage] );
}
callback(answers);
}, function(err) {
alert("Failed to collect code snippets"+err);
});
});
}