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

React组件中.then外访问state变量retrievedmrnNumber返回null如何解决

问题原因
  • 异步请求执行顺序问题:你调用的axios.get('api/Hospitalses/'+hospitalIdtoRetrieveMRNNumber)是异步网络请求,JS不会等它返回结果再往下走,所以.then外面的打印和selectedHospitals赋值代码会先执行,这时候retrievedmrnNumber还没被赋值,自然是null。
  • setState本身是异步更新的:就算你在.then里刚调用完setState就立刻打印this.state.retrievedmrnNumber,也大概率拿不到最新值,React会批量处理state更新,不会立刻生效。
解决方案

推荐用async/await改写异步逻辑,保证执行顺序符合你的预期,把所有依赖MRN返回值的逻辑都移到MRN请求完成之后执行即可。改后fetchRecords代码如下:

// 把fetchRecords改成async函数
async fetchRecords() {
  let url = 'myurl'
  this.setState({
    loading: true
  });       

  try {
    // 等待第一个请求返回
    const firstResponse = await axios.get(url)
    let selectedHospitals = [];
    let retrievedmrnNumber = null;

    if(this.props.value?.[0]){
      console.log('this.props.value is DEFINED - Request has been EDITED!!!!')
      const hospitalIdtoRetrieveMRNNumber = this.props.value[0].hospitalId;
      // 等待MRN请求返回
      const mrnResponse = await axios.get('api/Hospitalses/'+hospitalIdtoRetrieveMRNNumber)
      console.log("Extracting mrnNumber from Hospitals API results")
      console.log(mrnResponse.data.mrnNumber);
      retrievedmrnNumber = mrnResponse.data.mrnNumber;
      // 这里如果需要存到state可以存,赋值selectedHospitals直接用上面的变量就行,不用等state更新
      this.setState({ retrievedmrnNumber });
      // 依赖mrn的逻辑移到这里执行
      selectedHospitals = [{label: retrievedmrnNumber || 'Select'}]
    }else {
      console.log('this.props.value is UNDEFINED - it is a NEW  REQUEST');
    }

    if (this.props.value) {
      this.props.value.forEach(e => {
        const matchedHospital = firstResponse.data._embedded.Hospitalses.find(hospitalSet => hospitalSet.hospitalId === e.hospitalId)
        if(matchedHospital) selectedHospitals.push(matchedHospital)
      })
    }

    this.setState({
      loading: false,
      selectedHospitals: firstResponse.data._embedded.Hospitalses.map(item => ({
        label: item.mrnNumber.toString(),
        projectTitle: item.projectTitle,
        hospitalId: item.hospitalId,
      })),                    
      selectedHospitalsValues: selectedHospitals
    });
  } catch (err) {
    console.log(err)
    this.setState({ loading: false })
  }
}
额外说明

如果你一定要在.then外的其他地方(比如render里)用this.state.retrievedmrnNumber,只要做好空值判断就行,state更新后组件会自动重新渲染,值也会自动更新。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 23:45:08