鍍金池/ 問答/HTML/ 方法a調用含有post請求的方法b,為什么不能獲取方法b中的變量值?

方法a調用含有post請求的方法b,為什么不能獲取方法b中的變量值?

1、方法createAnimation調用方法getToken,getToken中發(fā)送了post請求,并將返回來的參數(shù)賦值給data()中的變量token,但是在createAnimation中用this.token獲取不到token的值

2、

createAnimation() {
    const t = this;
    this.viewDialog = true;
    this.viewTitle = this.anaInput;
    t.loading = true;
    t.getToken()
    // console.log(t.getToken());
    // this.$options.methods.getToken.bind(this)();
    console.log(222,t.token)
},

getToken() {
    // this.token='qqqq';
    this.$http.post(this.ip + '/getyoyatoken', { //獲取token
        userid: this.user_id
    }).then((res) => {
        if (res.data.data.result === 1) {
            this.token = res.data.data.list[0].token;
            // return res.data.data.list[0].token;
            console.log(111,this.token)
        }
    })
},

clipboard.png

3.根據(jù)百度的用this.$options.methods.getToken.bind(this)();或者this.$options.methods.getToken();也不起作用,而且報錯post undefined,我試了在getToken中直接給token賦值,在createAnimation中是可以獲取到的。變量token的值確實被改變了,在createAnimation方法中拿不到,但是在執(zhí)行完createAnimation后再執(zhí)行其他發(fā)法是能獲取到token的值的,我試了用setTimeout(()=>{this.getToken})也不行。如果直接讓getToken把響應結果return回來,createAnimation中將接收的結果打印出來是undefined

4、請問這是什么原因呢?

5、補充:

async createAnimation() {
    const t = this;
    this.viewDialog = true;
    this.viewTitle = this.anaInput;
    t.loading = true;
    t.token = await t.getToken();
    console.log(222,t.token)
}

這樣寫也不能獲取到token,因為多處調用到getToken方法,怎么可以簡便點,不需要重復寫getToken中那幾行代碼

回答
編輯回答
野橘

getToken是異步操作,執(zhí)行時會等待返回。
console.log是同步的,并不會等待getToken執(zhí)行完才執(zhí)行,而是立即執(zhí)行,由于getToken還未返回數(shù)據(jù),所以就是undefined。
你打個斷點跟一下,其實就明白了。

2017年10月28日 04:07
編輯回答
不歸路

關于5.補充。
await的方法(getToken)應該返回一個Promise,不然getToken還是同步的

getToken() {
    // this.token='qqqq';
    return this.$http.post(this.ip + '/getyoyatoken', { //獲取token
        userid: this.user_id
    }).then((res) => {
        if (res.data.data.result === 1) {
            this.token = res.data.data.list[0].token;
            // return res.data.data.list[0].token;
            console.log(111,this.token)
        }
        return Promise.resolve(this.token)
    })
}
2018年2月4日 20:39
編輯回答
莫小染

能不能靠譜點,你這http請求難道不是異步嗎?能打印出來才怪呢

2018年1月16日 07:55