遵循典型的REST标准,我将资源分解为单独的端点和调用。这里讨论的主要两个对象是List
和Item
(当然,列表中有一个项目列表,以及与之相关的其他一些数据)。
因此,如果用户想要检索他的列表,他可能会向api/Lists
然后,用户可能希望获取其中一个列表中的项目,并在前一次调用中检索到的api/ListItems/4
中找到“List.listId
”。
这一切都很好:options.complete
的{{1}}属性让我指向一个回调方法,所以我可以简化这两个事件。
但是,如果我想获得所有所有列表的元素,事情会变得非常混乱。例如,假设我有一个名为$.ajax
的库函数,它接收终点和回调函数,以使该代码更清晰。简单地以天真的方式检索3个元素会导致:
makeGetRequest
恶心!这就是编程101中的那种东西,我们被划过手腕并指向循环。但是如何通过循环实现这一点,而不必依赖外部存储?
var success1 = function(elements){
var success2 = function(elements){
makeGetRequest("api/ListItems/3", finalSuccess);
}
makeGetRequest("api/ListItems/2", success2);
}
makeGetRequest("api/ListItems/1", success1);
即使使用存储,我也必须知道所有何时完成并检索了他们的数据,并调用一些主函数来检索所有收集的数据并对其进行处理。
有处理这个的做法吗?这之前必须多次解决......
答案 0 :(得分:4)
尝试使用一堆端点参数:
var params = [];
var results [];
params.push({endpoint: "api/ListItems/1"});
params.push({endpoint: "api/ListItems/2"});
params.push({endpoint: "api/ListItems/3"});
params.push({endpoint: "api/ListItems/4"});
然后你可以在成功处理程序中递归:
function getResources(endPoint) {
var options = {} // Ajax Options
options.success = function (data) {
if (params.length > 0) {
results.push({endpoint: endpoint, data: data});
getResources(params.shift().endpoint);
}
else {
theMasterFunction(results)
}
}
$.get(endPoint, options)
}
你可以通过这样的一个电话启动它:
getResources(params.shift().endpoint);
修改强>
要保持所有内容自包含且不在全局范围内,您可以使用函数并提供回调:
function downloadResources(callback) {
var endpoints = [];
var results [];
endpoints.push({endpoint: "api/ListItems/1"});
endpoints.push({endpoint: "api/ListItems/2"});
endpoints.push({endpoint: "api/ListItems/3"});
endpoints.push({endpoint: "api/ListItems/4"});
function getResources(endPoint) {
var options = {} // Ajax Options
options.success = function (data) {
if (endpoints.length > 0) {
results.push({endpoint: endpoint, data: data});
getResources(endpoints.shift().endpoint);
}
else {
callback(results)
}
}
$.get(endPoint, options)
}
getResources(endpoints.shift().endpoint);
}
使用中:
downloadResources(function(data) {
// Do stuff with your data set
});
答案 1 :(得分:2)
dmck的回答可能是你最好的选择。但是,另一种选择是执行批量列表选项,以便您的api支持api / ListItems /?id = 1& id = 2& id = 3等请求。
你也可以做一个api搜索端点,如果这更适合你的个人审美。