2017-03-06 40 views
1

我目前正試圖從反應本機中的firebase數據庫返回用戶名。 console.log在函數內部工作,但不會在函數之外記錄任何內容。我不知道我哪裏錯了。這是我的代碼。我無法從firebase中檢索用戶名

componentWillMount() { 
    firebase.database().ref('/users/' + this.userId + '/username').once('value').then(function(snapshot) { 
    this.username = snapshot.val(); 
    console.log(this.username) 
    }); 
    console.log(this.username) 
    this.setState({ 
     username: this.username 
    }) 
    } 
+1

這是正常現象沿着代碼工作:代碼*內部*回調運行(可能多)晚於它後面的代碼。看到我的解釋在這裏:http://stackoverflow.com/questions/35419303/firebase-use-query-result-outside-function/35419533#35419533 –

回答

0

這是因爲JavaScript的異步性質。你應該在回調中做setState

firebase.database().ref('/users/' + this.userId + '/username').once('value').then(snapshot => { 
    this.username = snapshot.val(); 
    console.log(this.username); 
    this.setState({ 
     username: this.username 
    }) 
}); 
+0

當我嘗試,我迎接一個錯誤 – Patty

+0

可能未處理承諾拒絕 – Patty

+0

作爲你已經想通了,使用箭頭函數進行回調。它會在回調中自動綁定this。更新了我的答案。 – vinayr

0

出於某種原因,改變語法ES6的箭頭功能取得與添加this.setState在函數內部

componentWillMount() { 
    firebase.database().ref('/users/' + this.userId + '/username').once('value').then((snapshot) => { 
    this.username = snapshot.val(); 
    console.log(this.username) 
    this.setState({ 
     username: this.username 
    }) 
    }) 
    }