2017-09-26 484 views
0

我有這樣的vue2代碼:JavaScript函數總是返回未定義

checkUser2() { 
    var returnValue; 
    axios.get(`api/users/CheckUsername/${this.username}`) 
      .then(response => { 
       returnValue = response.data.error === 0; 
      }, errorCallBack => { 
       returnValue = false; 
      }); 
    return returnValue; 
} 

我把它叫做:

var a = this.checkUser2(); 
console.log(a); 

,它總是返回undefined。我究竟做錯了什麼?

+6

因爲ajax調用是異步的。 *函數返回後,它結束*。 – Bert

+0

只有ajax調用完成後,纔會填充returnValue。因此,如果您在成功回調中寫入console.log,它將被打印。 –

回答

6

如果要從此方法返回值,則必須從函數返回承諾並使用回調捕獲成功時的結果。

checkUser2() { 
    return axios.get(`api/users/CheckUsername/${this.username}`) 
     .then(response => response.data.error === 0, errorCallBack => false); 
} 

當你罵它:

this.checkUser2().then(value => console.log(value)) 
0

我一無所知vue2,但我知道在得到許諾axios作品,所以因爲你正在返回returnValue之外你的承諾,你的功能返回當前值returnValue,即undefined

0

這是因爲您在請求發出之前正在返回值。您需要制定承諾,並在其解決時返回該值。

checkUser2() { 
    return new Promise((resolve, reject) => { 

    var returnValue; 
    axios.get(`api/users/CheckUsername/${this.username}`) 
    .then(response => { 
     returnValue = response.data.error === 0; 
     resolve(returnValue); 
    }, errorCallBack => { 
     returnValue = false; 
     reject(returnValue); 
    }); 
    }); 
} 

然後你只需要調用它來獲取值:

this.checkUser2().then(val => { 
a = val; 
}) 

希望這有助於你。

+1

axios.get返回一個承諾。 – Bert