今天碰到一個面試問題,就是如果頁面中有兩個非同步ajax的操作,因為不確定這兩個非同步操作的執行順序,怎麼在這兩個操作都執行完再執行一個新的操作,最好的方法是什麼?
我當時回答了方法一:巢狀兩個ajax,在第二個ajax的回傳函數中執行新的操作。面試官回覆:這種方法太矬了。
於是想了下回答方法二:透過定時器setTimeout監聽局部變量,確保兩個非同步操作執行完了再執行新操作。面試官回覆:這種方式表現不好,能不能想到一個簡單又更合理的方法。
當時思考未果
所以把這個問題放上來尋求最好的方法是什麼?歡迎討論指點
1.Promise 包裝非同步ajax操作,
2.定義async 函數,
3.用await等待promise資料非同步取得完成
這一種方法簡潔高效,下面請看我專門給你寫的範例程式碼
我懶得用ajax取得資料了,就用settimeout這個函數模擬取得資料吧,這個函數是異步的,原理效果一樣。
http://api.jquery.com/jQuery....
目前瀏覽器環境中開箱即用的原生方法是 Promise.all。
以呼叫我的地圖庫 Sinomap Demo 為例,這個頁面中為了載入一張地圖,需要多個同時發起但不能確保返回順序的請求:
中國地形資料
各省份數值 JSON 資料
多種圖表疊加時多種圖表存在多種 JSON 資料需透過不同資料介面回傳…
解決方法直接在未包裝的
http://sinomap.ewind.us/demo/demo.js
中,範例:這樣透過 Promise 不僅實現了回呼邏輯的解耦,也實現了基礎的非同步流程控制。
剛剛看到jquery 的when 方法,所以給你重寫了一個,不一定有jquery的那麼好,但至少能實現效果了,可以在控制台直接輸入下述代碼試試,我勒個去,寫了我整整半小時。 。
問下能不能用jQ,能用的話直接:
順帶給個$.when的文檔參考
我覺得是Promise的方法 all還是什麼的
你的問題是有三件事 a,b,c。 c要在a和b結束之後再執行。
有很多方法: 例如你說的嵌套法 還有暴力監聽法
這個問題我曾經考慮過,以下是我的解答。
異步發射器
用數組保存如何執行非同步操作
注意裡面的函數都有個參數 commit ,它是一個函數 用來來回傳值。 當ajax成功的時候 把回傳值回傳進去就好
編寫發射器
processors 是 todos 這樣的數據。 cb 是最終回調。
並發他們
執行非同步發射器 並提供
最終回調
Link
https://eczn.coding.me/blog/%...
可以定義個變數a=0,ajax請求成功後在回呼裡設定a++;
然後在兩個回調中均判斷下a==2 執行操作函數
設定兩個flag,然後兩個ajax呼叫同一個回調,在這個回呼中判斷兩個flag都為true才執行後續操作。
把ajax寫在另一個ajax裡面再在回調那裡執行