Javascript 我无法从firebase检索用户名

Javascript 我无法从firebase检索用户名,javascript,firebase,react-native,firebase-realtime-database,Javascript,Firebase,React Native,Firebase Realtime Database,我目前正在尝试以react native从firebase数据库返回用户名。console.log在函数内部工作,但不记录函数外部的任何内容。我不知道我错在哪里。这是我的密码 componentWillMount() { firebase.database().ref('/users/' + this.userId + '/username').once('value').then(function(snapshot) { this.username = snapshot.v

我目前正在尝试以react native从firebase数据库返回用户名。console.log在函数内部工作,但不记录函数外部的任何内容。我不知道我错在哪里。这是我的密码

  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
    })
  }  

这是因为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
    })
});

这是因为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
    })
});

出于某种原因,将语法更改为es6的arrow函数使代码能够在函数中添加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
    })
  })
  }

出于某种原因,将语法更改为es6的arrow函数使代码能够在函数中添加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
    })
  })
  }

这是预期的行为:回调中的代码运行(可能要晚很多)比它后面的代码。请参阅我在这里的解释:这是预期的行为:回调中的代码运行(可能要晚很多)比它之后的代码运行。请看我在这里的解释:可能的未经处理的承诺拒绝,请使用arrow函数进行回调。它将在回调中自动绑定此。更新了我的答案。可能未处理的承诺拒绝。如果您已经发现,请使用箭头函数进行回调。它将在回调中自动绑定此。更新了我的答案。