You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native新手:Firebase Promise取值失败且setState报错求助

解决React Native中Promise回调里setState报错的问题

嘿,我一眼就看出你遇到的问题啦!这个TypeError: _this2.setState is not a function错误,本质是JavaScript普通函数的this上下文绑定问题——在GeoFire的事件回调和Promise的then回调里,你用了普通的function(),它的this并没有指向你的React组件实例,自然找不到setState方法。

核心解决方案:用箭头函数替代普通函数

箭头函数不会创建自己的this,它会继承外层作用域的this(也就是你的组件实例),这样就能正常调用setState了。我帮你修改了代码里的关键部分:

_getActivites() { 
  const latitude = 42.297761; 
  const longitude = 4.636235; 
  const radius = 5; 
  var keys = []; 
  var activitesToState = []; 
  const firebaseRef = firebase.database().ref("activites_locations/"); 
  const geoFire = new GeoFire(firebaseRef); 
  var geoQuery; 
  var activites = []; 
  geoQuery = geoFire.query({ center: [latitude, longitude], radius: radius }); 
  geoQuery.on("key_entered", (key, location, distance) => { // 改成箭头函数
    keys.push(key); 
  }); 
  geoQuery.on("ready", () => { // 改成箭头函数
    var promises = keys.map((key) => { // 改成箭头函数
      return firebaseRef.child(key).once("value"); 
    }); 
    Promise.all(promises).then((snapshots) => { 
      snapshots.forEach((snapshot) => { // 改成箭头函数
        activites.push(snapshot.val()); 
      }); 
      this.setState({ activitesState: activites }) 
    }).catch((error) => { 
      console.log(error); 
    }); 
  }); 
}; 

componentDidMount() { 
  firebase.auth().signInAnonymously() 
  .then(() => { 
    this.setState({ isAuthenticated: true }); 
  }); 
  this._getActivites(); 
}

额外提醒

如果你的_getActivites方法本身也出现this指向问题(比如调用时this不是组件实例),可以在组件的构造函数里手动绑定:

constructor(props) {
  super(props);
  this.state = {
    activitesState: [],
    isAuthenticated: false
  };
  this._getActivites = this._getActivites.bind(this); // 绑定方法的this到组件实例
}

这样修改后,回调里的this就会正确指向你的React组件,setState就能正常工作啦!

内容的提问来源于stack exchange,提问作者jeanjohny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:13:34