2011-11-04 15 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); 
    } 
})();