前端閉包 解決非同步執行問題
阿新 • • 發佈:2020-07-26
我主要用來解決 請求非同步 執行的問題, 不論是ajax請求,還是wx.request,以及其他非同步執行的方法
一,問題
由於request是非同步執行的原因,請求還沒有返回,迴圈已經執行完;
所以按照下面程式碼列印 三次結果值都是 索引 2
1 var dataList = ['aa','bb','bb'] 2 for(var ind in dataList){ 3 wx.request({ 4 url:'xxx', 5 sucess:function(res){ 6 console.log(ind) // 三次都是2 7 }8 }) 9 }
二,解決辦法
使用閉包來解決該問題: 通過在內部建立一個自執行函式儲存當次迴圈的索引
var dataList = ['aa','bb','bb'] for(var ind in dataList){ (function(data){ wx.request({ url:'xxx', sucess:function(res){ console.log(ind) } }) })(ind) } // 通過閉包函式引數儲存ind
這樣就能每次迴圈時,在請求回撥函式中使用檔次迴圈的索引了。
var dataList = ['aa','bb','bb'] for(var ind in dataList){ function fn(data){ wx.request({ url:'xxx', sucess:function(res){ console.log(ind) } }) } fn(ind) }
當然也可以直接將迴圈體封裝為一個函式來呼叫:
var dataList = ['aa','bb','bb'] for(var ind in dataList){ fn(ind) } // 通過閉包函式引數儲存ind function fn(ind){ wx.request({ url:'xxx', sucess:function(res){ console.log(ind) } }) }
這樣每次列印的就是當次迴圈的索引了