同步AJAX ......我知道这听起来很疯狂

时间:2011-11-04 14:48:27

标签: javascript ajax

我在.Net 4.0网络应用程序中通过AJAX调用Web方法。在许多情况下,AJAX调用是在for循环中重复进行的。我的问题是,Web方法与我的服务器同步的信息是带时间戳的,因此必须按照我将其发送到AJAX的顺序进行同步。不幸的是,它似乎无论先完成,只是先完成,时间戳都是乱序。我需要基本排队我的AJAX请求,以便它们按顺序而不是异步执行,我知道这是AJAX中的A,所以这可能是一个完全愚蠢的问题。

如何强制执行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 个答案:

答案 0 :(得分:3)

你必须使用回调。

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

//etcetera...

或者我可以建议使用像jQuery这样的javascript库来同步你的ajax请求。

答案 1 :(得分:1)

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

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

答案 2 :(得分: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);
});

在for循环中执行此操作需要递归。

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