ajax使用中發現的問題與深入擴展(for循環中嵌套ajax)


在學習ajax的過程中,我曾經遇到過這樣的一個問題,為了得到一個詳情列表,我要先向服務器去請求得到索引表,簡單描述就是ajax中的success中的for循環中再次嵌套了ajax,結果第二層success中的ajax的success並不能取得上層ajax的success中的值。

我先使用ajax發送請求獲得索引表,再使用for循環去依次使用索引目錄去獲得詳情列表中想要的數據。當時因為水平有限,用了一個最不合理的方式,於是產生了這么一個莫名其妙的問題。

但是很奇怪的是每次傳入的參數都是undefined,糾結了好久,發現自己的整體思路和代碼並沒有錯誤,於是回到ajax的特性上來,忽然一拍腦袋,ajax請求也是事件呢,因此又牽扯到JavaScript中的單線程問題,於是我先把傳遞數據的下標-1(因為事件排隊,for循環已經執行完畢,所以for循環中的最后的數據下標已經越界),果然取得的所有數據都是最后一位,證實了我的想法。

首先,我很單純的設置了一個全局變量,使用全局變量去保存每次取得的值,但是馬上否定了自己,因為這並沒有什么意義,因為等ajax事件執行的時候這個全局變量已經又是最后一個值了。

然后我又用了一個自認為比較巧妙的辦法,在第二層ajax請求中把想傳給下層的ajax的success回調函數的值放在請求數據里,在服務器端的php頁面中,把我傳入的值再封裝到原來要傳入到第二個ajax的json數據中。當然,按照預想實現了想要的結果,后來又想了想,如果應用同樣的道理,把數據存入sessionStorage或者cookie未嘗不可。

但是很快否定了自己的這個想法,因為這樣確實解決了問題,當時還是很高興的,但是回頭一想,這樣不也是多此一舉嗎?把數據傳入服務器再傳入客戶端,只是為了兩個回調函數之間的數據傳輸根本划不來。如果服務器不需要向客戶端傳輸數據了呢?這個數據已經沒地方可以附加,更不可能給它單寫一個方法來接收這個數據。而且本身就是一種風險和開銷。因此使用把數據傳入服務器再傳回客戶端實現兩個回調函數之間的數據傳輸並不是一個明智的方法(但是我還是不否定可能將來會有它發揮作用的時候)。存入session來完成兩個回調函數之間的傳參怎么都讓人有一種特別滑稽的感覺。

后來想了想這個邏輯,如果從for循環來講,我的問題是for循環中的事件會排隊,參數不能按照預想傳遞。如果我把第二層的ajax代碼段封裝到一個函數中呢?每次循環都調用函數並且給函數傳參,使用函數中的參數來保存每次想要傳下去的值,發現問題確實簡簡單單的解決了。

然而過了並不是很久,我仔細想了想, 因為這兩次的ajax異步請求是綁定在一起的,是為了去查詢兩個表中的數據,如果使用兩次ajax去請求資源是不是本身就有問題?為什么不能合並成一起?於是我修改了自己的php文件結構,在服務器端先查詢一次索引表,再通過循環去數據庫查詢詳情表。把結果拼接成自己想要的json數據一次打包傳回來。

在后面的學習中,我突然意識到數據庫語句本身就很強大,如果兩個表有關系是否可以一次查詢呢?好像大學里的知識印象冒出來了一點,然后去補了一下下數據庫的知識(數據庫並不是很好,只能完成基本的增刪改查QAQ),原來在服務器端的數據庫中使用多表查詢就可以完全解決這個問題。好吧,問題至此解決(至少目前)。

雖然一個簡單的問題讓我繞了一圈才得以完美的解決,但是在初學的路上,我覺得應該學到的更多的是思維的方法,解決問題的方式,舉一反三的能力。很感謝在諸多問題困撓的情況下自己還能這么的去想去鑽研一下問題,驗證一些想法。將來可能覺得現在所有的問題都那么幼稚,但是我相信,在這條漫漫的成長之路上,等某天回顧的時候,風景會是很美的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM