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

为何Promise.then()返回的数据,组件接收时显示为Promise {<pending>}?

问题原因与解决方案

核心问题

getParsedFruit方法本身返回的就是Promise对象——哪怕你在then回调里返回了entries,整个方法的返回值依然是处于pending状态的Promise,而非最终的同步数据。

JavaScript中,只要函数内部包含异步操作(比如这里的farmAPI.fetchCrate是异步请求),函数的返回值必然是Promise:它不会等待异步操作完成再返回结果,而是直接返回一个未完成的Promise实例。


解决方案:用组件状态管理异步数据

类组件中,需要把异步获取的数据存到组件状态里,再将状态传递给子组件,这样子组件拿到的就是最终解析好的数据。

基础实现(仅首次挂载时请求)

class Produce extends React.Component {
  state = {
    fruitEntries: []
  };

  // 组件挂载完成后发起异步请求
  componentDidMount() {
    this.fetchAndParseFruit();
  }

  // 用async/await简化异步代码(也可以继续用then链式调用)
  fetchAndParseFruit = async () => {
    try {
      const apples = await farmAPI.fetchCrate('fruit');
      const { entries } = getParsedResponse(apples);
      // 更新状态,触发组件重新渲染
      this.setState({ fruitEntries: entries });
    } catch (error) {
      // 处理请求失败的情况
      console.error('获取水果数据失败:', error);
      this.setState({ fruitEntries: [] });
    }
  };

  render() {
    // 从state取数据传给Stand组件
    return <Stand items={this.state.fruitEntries} />;
  }
}

进阶实现(依赖props变化时重新请求)

如果需要根据props变化重新获取数据,可以配合componentDidUpdate:

class Produce extends React.Component {
  state = {
    fruitEntries: []
  };

  componentDidMount() {
    this.fetchAndParseFruit();
  }

  // 当依赖的props变化时,重新请求数据
  componentDidUpdate(prevProps) {
    if (prevProps.crateType !== this.props.crateType) {
      this.fetchAndParseFruit();
    }
  }

  fetchAndParseFruit = async () => {
    try {
      const apples = await farmAPI.fetchCrate(this.props.crateType || 'fruit');
      const { entries } = getParsedResponse(apples);
      this.setState({ fruitEntries: entries });
    } catch (error) {
      console.error('获取水果数据失败:', error);
      this.setState({ fruitEntries: [] });
    }
  };

  render() {
    return <Stand items={this.state.fruitEntries} />;
  }
}

额外修复:getParsedResponse的逻辑漏洞

你的getParsedResponse函数中,map回调里存在逻辑不完整的问题:当item.source存在时,你创建了source变量但没有返回,会导致这部分item变成undefined。建议修正:

export const getParsedResponse = (response?: { entries: Array<any> }) => {
  if (!response || !response.entries || !response.entries.length) {
    return { entries: [] };
  }

  const parsedData: Array<Object> = response.entries
    .map(item => {
      if (!item.source) {
        return null;
      }
      // 补充返回处理后的source对象
      return { ...item.source };
    })
    // 可选:过滤掉null值,避免子组件处理无效数据
    .filter(Boolean);

  return { entries: parsedData };
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:13:14