2013-06-28 38 views
0

我开发一个内部的基于Web的工具异步Ajax调用如预期

在我需要生成基于一个数组值AJAX调用序列中不起作用。我作为同步之前提出的,如果我做了这样的话它会阻止浏览器,所以我不能能显示加载图像,而AJAX会。

因此,我将呼叫改为异步,现在会发生什么情况是ajax呼叫正在发送,响应与用户界面中的所有呼叫相同,但是如果我在萤火虫中检查响应是否清晰,如果我在循环中放一些警报,那么它工作正常。

我发布的代码作进一步参考

// 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; 
      } 

回答

0

尝试应用内环路闭合:

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

什么问题就用封闭来解决? – zeroflagL

+0

保持内部变量的引用(值),否则异步调用可以使用最后一个值,而不是当前的一个。但我不知道这会在这种情况下作品我没有详细检查足够的代码,并使用超时可能是这里的问题 –

+0

我明白倒闭的总体思路;)我只是不知道为什么一会想在这里添加一个。您保存的唯一值是'locparam',它在函数中既不会被更改,也不会被回调使用。 – zeroflagL

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"的操作。这样浏览器将处理所有的呼叫,即使它们是即时完成的。

希望这有助于!