鍍金池/ 問(wèn)答/HTML/ js閉包取值

js閉包取值

嵌套調(diào)用接口函數(shù)來(lái)獲取并更改信息,但是第二個(gè)接口函數(shù)取不到循環(huán)的i值,嘗試傳參,但是then方法又不太了解
fetchUserList(this.listQuery).then(response => {

    this.list = response.data.list
    for(var i=0;i < this.list.length;i++){
      this.list[i] = Object.assign({},this.list[i],this.list[i].sysUser)
      // this.list[i].office = getOfficeInfoById(this.list[i].officeId)
      getOfficeInfoById(this.list[i].officeId).then(response =>{
        this.office = response.data.data.name
        console.log(i)
      })
    }
    console.log(this.list)
    this.total = response.data.total 
    this.listLoading = false
  }) 
  
回答
編輯回答
若相惜

解決

把循環(huán)里面的var 換成let
for (let i=0;)

原因

你這種寫法.每次都是取的最后一個(gè)i的值,即i總是等于this.list.length -1

原理

  • 何為異步

    • 就是把所有同步方法執(zhí)行完畢之后,再開(kāi)始執(zhí)行異步方法.即,如果你的循環(huán)是5次,那么系統(tǒng)會(huì)先執(zhí)行循環(huán)這個(gè)代碼,執(zhí)行完一次循環(huán),就在最后面排一個(gè)異步方法,一共排上5個(gè),等循環(huán)代碼執(zhí)行完了,再依次執(zhí)行這5個(gè)異步方法
    • 等你循環(huán)代碼執(zhí)行完的時(shí)候,i已經(jīng)變成5了,所以每個(gè)異步方法取的值都是5
  • 何為閉包

    • 閉包就是在異步方法里面,能夠取到異步方法外的變量值...你這里的需求是,每個(gè)異步方法,取第一次循環(huán)的i值.所以必須定義局部變量傳參
2018年4月15日 17:52
編輯回答
雨蝶

可以通過(guò)閉包的形式來(lái)取到循環(huán)的值:
循環(huán)代碼修改如下:

for (var i = 0; i < this.list.length; i++) {
        this.list[i] = Object.assign({}, this.list[i], this.list[i].sysUser)
        // this.list[i].office = getOfficeInfoById(this.list[i].officeId)
        var _self = this;
        (function (officeId, i) {
            getOfficeInfoById(officeId).then(response => {
                _self.office = response.data.data.name
                console.log(i)
                //你的代碼
            })
        })(this.list[i].officeId, i)
    }
2018年2月13日 10:26