循环中的异步ajax调用无法按预期工作

时间:2013-06-28 09:39:23

标签: jquery ajax asynchronous

我正在开发一个基于内部网络的工具

因为我需要根据数组值生成一系列ajax调用。我之前做过同步,如果我这样做,那么它会阻止浏览器,所以我无法在ajax运行时显示加载图像。

因此我将调用更改为异步,现在发生的是ajax调用正在进行拉伸,并且响应与UI中的所有调用相同,但如果我在firebug中检查响应是否清楚,如果我在循环中放置一些警报,那么它可以正常工作。

我发布了代码以供进一步参考

// calling the function within loop
$.each(texts, function (tind, tval) {
                    setTimeout(function () {
                        txtcmpare(tval, search_logo, ask_logo, option_logo);
                    },2000);
                });

//the function which calls ajax (txtcmpare)
function txtcmpare(actval, sl, al, ol) {
                var tch_locale = new Array();
                var tch_tempname = new Array();

                    if (actval != "==" && actval != "") {
                        avail = 0;
                        tparam = actval;

                        //respout = findloacle(param);
                       setTimeout(function () {
                            findloacle(tparam, function (y) {
                                // my operations
                                 });
                              },2000);
                           }
                         if I put some alert here, sometimes response are clear
                          }

//the ajax function
function findloacle(locparam,callback) {
                //var loc = new Array();
                $.ajax({
                    type: "POST",
                    url: "Services/Locale.asmx/ajaxresp",
                    contentType: "application/json; charset=utf-8",
                    data: JSON.stringify({ queryparam: locparam }),
                    dataType: "json",
                    cache: false,
                    success: function (data) {
                        //loc = result.d;
                        callback(data);

                    },
                    error: function () {
                        alert("error");
                    }

                });
                //return loc;
            }

2 个答案:

答案 0 :(得分:0)

尝试在循环内应用闭包:

$.each(texts, function (tind, tval) {
    (function (_tval) {
        setTimeout(function () {
            txtcmpare(_tval, search_logo, ask_logo, option_logo);
        }, 2000);
    }(tval));
});

答案 1 :(得分:0)

我自己也遇到过类似的问题。我在while循环中运行了一系列ajax请求。有些电话没有发出!它杀了我!!我的结论是我的浏览器 - 谷歌浏览器 - 忽略了“重复”请求。

看看这个伪代码:

while (i < ajaxCallArray.length) {
    currentAjaxObject = ajaxCallArray[i];
    ajaxPost = $.post(currentAjaxObject.url, function(data) {
    //response data needs to go into a function such that each request gets its own "data" variable created.otherwise it just overwrites data!!
    processAjaxResponse(data, currentAjaxObject);
        },"json");
i++;
}

如果ajaxCallArray[0].url = "http://www.google.com"ajaxCallArray[1].url = "http://www.google.com"ajaxCallArray[2].url = "http://www.google.com",浏览器只会实际拨打1个电话!!

即使您不使用这些网址参数,也必须执行ajaxCallArray[0].url = "http://www.google.com?count=0"ajaxCallArray[1].url = "http://www.google.com?count=0"ajaxCallArray[2].url = "http://www.google.com?count=0"之类的操作,只需添加一些内容即可使其区别开来。这样浏览器就会处理所有的呼叫,即使它们是立即完成的。

希望这会有所帮助!!

相关问题