6

按照典型的 REST 标准,我将资源分解为单独的端点和调用。这里讨论的主要两个对象是ListItem(当然,一个列表有一个项目列表,以及与之关联的一些其他数据)。

因此,如果用户想要检索他的列表,他可能会发出 Get 请求api/Lists

然后,用户可能想要获取其中一个列表中的项目,并从上一次调用中检索到的位置获取api/ListItems/44 。List.listId

这一切都很好: 的options.complete属性$.ajax让我指向一个回调方法,因此我可以简化这两个事件。

但是,如果我想获取所有相关列表的元素,事情就会变得非常混乱。例如,假设我有一个名为的库函数makeGetRequest,它接收端点和回调函数,以使这段代码更清晰。简单地以天真的方式检索 3 个元素会导致:

var success1 = function(elements){
    var success2 = function(elements){
       makeGetRequest("api/ListItems/3", finalSuccess);
    }
    makeGetRequest("api/ListItems/2", success2);
}
makeGetRequest("api/ListItems/1", success1);

恶心!这就是编程 101 中的那种东西,我们在手腕上拍了一下并指向循环。但是你怎么能用循环来做到这一点,而不必依赖外部存储呢?

for(var i : values){
    makeGetRequest("api/ListItems/" + i, successFunction);
}

function successFunction(items){
    //I am called i-many times, each time only having ONE list's worth of items!
}

即使有了存储,我也必须知道所有人何时完成并检索了他们的数据,并调用一些主函数来检索所有收集的数据并对其进行处理。

有处理这个的做法吗?这个问题应该已经解决过很多次了...

4

2 回答 2

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
});
于 2012-08-02T17:48:34.167 回答
2

dmck 的答案可能是您最好的选择。但是,另一种选择是执行批量列表选项,以便您的 api 支持诸如 api/ListItems/?id=1&id=2&id=3 之类的请求。

如果这更符合您的个人审美,您也可以做一个 api 搜索端点。

于 2012-08-02T17:53:03.947 回答