同時發送了多次ajax請求,且都是非同步,怎樣拿取某一次ajax請求的返回資料。

來源:互聯網
上載者:User

一:需求

要實如下輸入框可支援模糊查詢,查詢字串:“nick”。


二:實現原理

給輸入框綁定keyup事件,然後ajax請求,帶輸入的參數去後台資料庫拿出資料再返回到頁面。


三:分析

1),ajax 請求設定成同步。

performance會不好,因為是同步,所以當你輸入"n"  時就會發出一次ajax請求,而且這個時候輸入框不能再輸入字元,必須等第一次請求結束後才能繼續輸入"i"。當然這個時候返回來的資料肯定是正確的。


1),ajax 請求設定成非同步。就不必擔心一次只能輸入一個字元了,可以一次性輸完。這個時候也是發出了四次ajax 請求。”n“,"ni","nic","nick"分別發了一次ajax請求。現在問題來了:如果代碼是下面這樣的話,就會有問題。

$("[name='searchkey']").keyup(function(){var inputName = this.value;var existSelectUser = "false";if($("#selectSCNames").find("option").length>0){existSelectUser = "true";}$.ajax({url:"<%=home%>/UserDailyActionReportAction.do?operation=getMatchUser",data:{"inputName":inputName,"existSelectUser":existSelectUser},async:true,dataType:"JSON",type:"POST",success:function(result){$("#showDiv").html(result.matchedUsers);}});});



發現輸入”nick“後查詢到的結果不正確。



原因是什麼呢:看下面的圖片,


其實由代碼可以看出,其實拿的是最後一次請求的返回資料。但是由於四次請求的時間各不相同,雖然”n“和”ni“首先被觸發,但是他們用的時間都比”nic“和”nick“多,所以最後拿的資料是請求時間最多的那次ajax請求返回來的資料,也就是”ni“這個請求的資料。而我們輸入的字串是”nick“。所以會出現資料不匹配的問題。



如何解決呢。。

使用如下代碼的話就可以正常work了。

var datas = new Array();var i = 0;$("[name='searchkey']").keyup(function(){i++;var inputName = this.value;var existSelectUser = "false";if($("#selectSCNames").find("option").length>0){existSelectUser = "true";}$.ajax({url:"<%=home%>/UserDailyActionReportAction.do?operation=getMatchUser",data:{"inputName":inputName,"existSelectUser":existSelectUser,"index":i},async:true,dataType:"JSON",type:"POST",success:function(result){var index = result.index;var ind = index-1;datas[ind] = result.matchedUsers;$("#showDiv").html(datas[i-1]);}});});


分析:


1:此處建立了一個數組和一個index。

2:每觸發一次keyup,index加1。

3:每次請求時,帶著index,作為一個參數。

4,:返回傳進去的index。

5,將返回資料塞進數組的第index個位置。

6,取數組最後一個位置的資料。

為什麼取的資料會是正確的呢。

因為雖然”nick“是第四次觸發keyup時間的,所以”i“ 是4,所以他請求時傳進去的index是4,返回來的index也是4。雖然它是請求時間是最短的,但是他返回來的資料會被放到數組的第四個位置上。其實不管”nick“ 的請求時間是排第幾位,因為他是第四次觸發keyup事件的,所以他請求時傳進去的index是4,所以他這個請求返回來的資料都會被塞到數組的第四個位置上。所以就不會出現查詢出的資料不正確的問題了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.