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

为什么基于Promise映射的变量会在Promise完成前返回pending状态?

问题原因
  • 首先是JavaScript语法层面的硬性规定:所有标记为async的函数,返回值都会被自动包装为Promise对象,和函数内部的执行逻辑无关。你在refreshTableData里即使最后return的是普通数组rowDataArray,外部拿到的永远是包裹了这个数组的Promise。
  • 其次是React的渲染逻辑是同步执行的:你在组件渲染阶段直接调用refreshTableData(),此时接口请求还没有返回,函数执行到await axios.get就会暂停,先返回Pending状态的Promise给渲染流程,组件会拿着这个Promise完成首次渲染,所以generateRows拿到的就是Promise对象,输出对应的日志。
  • 等后续接口请求完成,await后的逻辑才会继续执行,填充rowDataArray、打印函数内部的日志,但此时组件已经完成渲染,你没有把返回的数据存到React state里触发重渲染,组件自然拿不到更新后的数据。
修复方案
  1. 用React的useState存储表格数据,useEffect触发异步数据请求,请求完成后更新state触发组件重渲染,把最新数据传给子组件。
    修正后的HealthDashboard代码如下:
import { useState, useEffect } from 'react';

export const HealthDashboard = () => {
    const [rowDataArray, setRowDataArray] = useState([]);
    // 可选:添加加载状态、错误状态提升用户体验
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState(null);

    useEffect(() => {
        const getTableData = async () => {
            try {
                setLoading(true);
                const data = await refreshTableData();
                setRowDataArray(data);
                setError(null);
            } catch (err) {
                setError('数据加载失败,请稍后重试');
                console.error(err);
            } finally {
                setLoading(false);
            }
        };
        getTableData();
    }, []);

    if (loading) return <div>数据加载中...</div>;
    if (error) return <div>{error}</div>;

    return (
        <div>
            <DeviceStatusTable systemName="Minestar Edge" rowDataArray={rowDataArray}/>
        </div>
    );
};
  1. 额外优化:你原来的refreshTableData里用map遍历数组但没有用到返回值,这种场景推荐用forEach更符合语义,避免误解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 08:24:08