在學習ajax的過程中,我曾經遇到過這樣的一個問題,為了得到一個詳情列表,我要先向伺服器去請求得到索引表,簡單描述就是ajax中的success中的for迴圈中再次嵌套了ajax,結果第二層success中的ajax的success並不能取得上層ajax的success中的值。 我先使用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),原來在伺服器端的資料庫中使用多表查詢就可以完全解決這個問題。好吧,問題至此解決(至少目前)。
雖然一個簡單的問題讓我繞了一圈才得以完美的解決,但是在初學的路上,我覺得應該學到的更多的是思維的方法,解決問題的方式,舉一反三的能力。很感謝在諸多問題困撓的情況下自己還能這麼的去想去鑽研一下問題,驗證一些想法。將來可能覺得現在所有的問題都那麼幼稚,但是我相信,在這條漫漫的成長之路上,等某天回顧的時候,風景會是很美的