1. 程式人生 > 實用技巧 >前端閉包 解決非同步執行問題

前端閉包 解決非同步執行問題

我主要用來解決 請求非同步 執行的問題, 不論是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)
        }
    })
}

這樣每次列印的就是當次迴圈的索引了