正确处理嵌套的ajax请求的方法

时间:2013-10-17 12:22:08

标签: javascript jquery ajax request nested

我想知道是否有任何正确的方法可以防止ajax请求在同时调用多个(同步或异步)时发送随机404/500错误

e.g。一个简单的html表,其中包含一些行和列,以显示包含一些数据的500-800人的列表

要走的路:

  1. 从后端通过选择(带有组织单位的html表单)获取ppl,并将结果列表写在表的第一列中
  2. 通过他/她的personId(第一次请求的结果)获取每个人的事件
  3. 获取每个人的属性
  4. 为每个人创造角色
  5. 根据每个人的个人属性,角色和事件,从后端获取计算的内容。
  6. 伪代码:

    function createTableData(){
    
      var selected;
      var personIds;
    
     //get personIds by selection and write them into table
    
     object.executeJSONRequest(...,
            {   _ts: new Date().getTime(),
                input: selected
            },function(data) {
    
                       // write result into table
                       // fill resourceIds with result param
    
            },..);
    
      getEvents(personIds);
      getAttribtues(personIds);
      getRoles(personIds);
      calculateStuff(personIds);
    
    }
    
    
    function getEvents(personIds){
       object.executeGetRequest('...',
            {   _ts: new Date().getTime(),
                ppl: personIds
            },function(data) {
                       //add result to table
            }
    }
    
    function getAttributes(personIds){...}  //and so on..
    

    如果我连续调用所有这些方法,有时在加载属性时有时会出现随机错误,有时在加载角色时,有时一切正常。

    如果我把它们称为嵌套在每个ajax成功块中,如

    function createTableData(){
    
         object.executeJSONRequest(...
                {   _ts: new Date().getTime(),
                    input: selected
                },function(data) {
    
                           getEvents(..);
    
                        });
     }
    
    function getEvents(..){
      object.executeGETRequest(...
                {   _ts: new Date().getTime(),
                    input: selected
                },function(data) {
    
                           getAttributes(..);
    
                        });
     }
    
    
    function getAttributes(..){  ...,function(data){ getRole(..)});  and so on
    

    一切正常。如果我尝试使用类似

    的解决方案
     document.ajaxStart/Stop(function(){  //if table columns i expected are filled do next}
    

    我必须检查所有必要的表colums,如果它们已经填充了数据。

    有没有真正合适的解决方案我只是想不到? (jQuery版本1.2 / IE V7-8 ^^)

1 个答案:

答案 0 :(得分:0)

“如果可能,请更新jquery和版本”

首先,为什么要在一个进程中调用多个服务器调用。

如果将所有流程合并到一个请求和响应周期中,最好在java代码中执行所需的数据处理。不要随意返回请求和响应。

你可以使用jquery ajax返回ajax调用的状态。

     $.post("url",function(result,status){{
            if(status == success){
    //continue....
    }else{
          alert("Sorry something went wrong");
         }
      }});

像这样检查所有请求天气它成功完成。

我强烈建议您考虑将所有ajax调用合并为一个请求。