用最簡單直白的方式告訴你偷懶, 天天分享一個用得着的小技巧 前端
咱們的接口存在依賴調用的狀況下,A接口的返回值,是B接口的入參,而A接口返回值又是一個數組,B接口入參只能是一個字符串的狀況下,怎麼辦?jquery
接下來直接上代碼ios
function getUser() {
$.ajax({
type: 'post',
url: 'http://localhost/a',
success: function(res) {
// A接口的返回值是B接口的入參
// list 是一個數組 [{id: 1},{id: 2}]
var list = res.data.list
getAllData(list)
}
})
}
// 調用B接口
function getAllData(list) {
var resList = []
// 若是使用 let 就不須要使用閉包
for(var i=0; i<list.length; i++) {
// 閉包
(function(i){
$.ajax({
type: 'post',
url: 'http://localhost/b',
data: {
id: list[i].id
}
// 這裏同步調用接口
async: false,
success: function(res) {
// 將b接口返回的數據push到外面容器中
resList.push(res.data)
}
})
))(i)
}
// 上面是同步代碼,js非要等全部的邏輯處理完成,纔會處理這後面的邏輯
console.log(1)
// 在這裏對 resList數據作處理
}
複製代碼
以上就是解決循環調用ajax會遇到的問題, js是單線程,若是使用同步去調用接口,而這個接口會很是慢的狀況下,頁面會出現假死的現象, 其實就是由於接口沒返回,後面的代碼根本不會執行,要一直等接口返回內容會處理後續的邏輯ajax
上面只是用 jquery調用接口,使用 axios或者寫原生js調用,都是沒什麼差別的,都是要同步調用axios
js全部的同步任務,都會從上到下,推送到 「執行棧」 中,等全部的同步代碼執行完,纔會去執行 「任務隊列」 中的內容數組
這就是 事件循環閉包
!!! 極力不推薦同步調用接口 ☺☺☺async