2011-11-04 56 views
0

我有一个web方法,通过AJAX在.NET 4.0 web应用程序中调用。在很多情况下,AJAX调用在for循环中重复进行。我的问题是,Web方法与我的服务器同步的信息有时间标记,因此必须按照我将它发送给AJAX的顺序进行同步。不幸的是,它似乎首先完成,只是首先完成,时间戳全部无序。我需要基本排队我的AJAX请求,以便他们顺序执行而不是异步执行,我知道这是AJAX中的A,因此这可能是一个完全愚蠢的问题。同步AJAX ...我知道这听起来很疯狂

如何强制在for循环中完成AJAX调用的执行顺序?

编辑:一些代码

    for (var i = 0; i < itemCnt - 1; i++) { 

        try { 
         key = items[i]; 
         item = localStorage.getItem(key); 
         vals = item.split(","); 
         type = getType(key); 


         if (type == "Status") { 
          var Call = key.substring(7, 17); 
          var OldStat = vals[0]; 
          var NewStat = vals[1]; 
          var Date1 = vals[2]; 
          var Time1 = vals[3]; 
          var miles = vals[4]; 

          try { 
           stat(Call, OldStat, NewStat, Date1, Time1, miles, key); 

          } 
          catch (e) { 
           alert("Status " + e); 
           return; 
          } 

         } 
         else if (type == "Notes") { 
          var Call = key.substring(6, 16); 
          var Notes = item; 
          try { 
           addNotes(Call, Notes); 
          } 
          catch (e) { 
           alert("Notes " + e); 
           return; 
          } 
         } 
         else if (key == "StartNCTime" || key == "EndNCTime") { 
          var TechID = vals[0]; 
          var Date = vals[1]; 
          var Time = vals[2]; 
          var Activity = vals[3]; 
          var Location = vals[4]; 
          var Type = vals[5]; 

          try { 
           logTime(TechID, Date, Time, Activity, Location, Type, 
          } 
          catch (e) { 
           alert(key + ' ' + e); 
           return; 
          } 

         } 
        } 
        catch (e) { 
         alert(key + ' ' + e); 
         return; 
        } 
       } 

function stat(Call, OldStat, NewStat, Date1, Time1, miles, key) { 
$.ajax({ 
    type: "POST", 
    dataType: "json", 
    contentType: "application/json", 
    url: "Service.asmx/update_Stat", 
    data: '{ CallNumber:"' + Call + '", OldStat:"' + OldStat + '", NewStat:"' + NewStat + '", Date1:"' + Date1 + '", Time1:"' + Time1 + '", Miles: "' + miles + '"}', 
    success: function (data) { }, 
    error: function (xhr, status, error) { 
     var err = eval("(" + xhr.responseText + ")"); 
     alert("Sync Update Stat: " + err.Message); 
     location = location; 
    } 
}); 
} 

function logTime(TechID, Date, Time, Activity, Location, Type, key) { 
$.ajax({ 
    type: "POST", 
    dataType: "json", 
    contentType: "application/json", 
    url: "Service.asmx/nonCallTime", 
    data: '{ TechID:"' + TechID + '", Date1:"' + Date + '", Time1:"' + Time + '", Activity:"' + Activity + '", Location:"' + Location + '", Type: "' + Type + '"}', 
    success: function (data) { }, 
    error: function (xhr, status, error) { 
     var err = eval("(" + xhr.responseText + ")"); 
     alert("Sync Non Call Time: " + err.Message); 
     location = location; 
    } 
}); 
} 

function addNotes(Call, Notes) { 
$.ajax({ 
    type: "POST", 
    dataType: "json", 
    contentType: "application/json", 
    url: "Service.asmx/addNote", 
    data: '{ Call:"' + Call + '", Notes:"' + Notes + '"}', 
    success: function (data) { }, 
    error: function (xhr, status, error) { 
     var err = eval("(" + xhr.responseText + ")"); 
     alert("Sync Notes: " + err.Message); 
     location = location; 
    } 
}); 

}

回答

3

你必须使用回调。

function ajax1(){ 
    //..some code 
    //on ajax success: 
    ajax2(); 
} 

//etcetera... 

或者我可能会建议使用javascript库,例如jQuery来同步您的ajax请求。

+0

我不知道迭代的确切数目的for循环,直到运行时也不我真的知道这Ajax调用需要进行,直至for循环的每个迭代,当我确定包含的信息的类型在里面。我将编辑我的帖子以包含一些示例代码。 – jmease

+0

您提到使用jQuery进行同步。那看起来怎么样?对不起,我是100%自学的noob。 :) – jmease

+0

@jmease http://api.jquery.com/jQuery.ajax/并将'async'设置为'false' – Neal

1

将xmlhttp对象的open方法中的第三个参数设置为false以使其同步。

http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp

+0

-1用于引用w3schools,-1用于推荐sjax – Raynos

+1

@Raynos这仅仅是告知OP关于同步ajax的存在,请阅读问题的标题。但我不一定会使用这个。告诉人们它存在有什么问题,不管它是好还是坏? 我宁愿保存所有回复,并在收到所有回复后根据时间戳进行处理。 – Birey

+0

问题在于,如果不提及这是一种不好的做法,则可能会促进不良行为。 – Raynos

0

制作系列会是这样操作的一般模式:

function doAjax(data, cb) { 
    ... 
    // when ready call cb 
} 

(function (next) { 
    var xhr = doAjax(data, next); 
})(function (next) { 
    var xhr = doAjax(data, next); 
})(function (next) { 
    doAjax(data); 
}); 

这样做在一个循环需要递归。

(function next() { 
    if (i < n) { 
    doAjax(data[i++], next); 
    } 
})();