2013-06-28 37 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"的操作。這樣瀏覽器將處理所有的呼叫,即使它們是即時完成的。

希望這有助於!