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

如何在export导出变量时使用async await等待异步数据加载完成

问题原因

ES 模块的导出属于静态绑定,会在模块初始化阶段立即执行。你代码中调用的api()是异步函数,fetch请求还没返回结果的时候,export default INITIAL_EVENTS就已经执行了,此时INITIAL_EVENTS还是初始的空数组,所以导入方拿到的就是空值。即使后续异步执行完成往数组里插入了数据,同步使用该导出值的场景也感知不到后续的数组内容更新。

解决方案1:导出Promise(推荐)

直接导出异步操作的Promise实例,导入方通过await即可拿到填充完成的数组:

let eventGuid = 0
let INITIAL_EVENTS = [];

function getDatas(){
  return fetch("http://localhost:3214/events")
    .then((data) => data.json())
    .catch((err) => console.log(err))
}

// 立即执行的异步函数,导出其Promise实例
export default (async function () {
  const datas = await getDatas();
  datas.forEach(element => {
    INITIAL_EVENTS.push(element)
  });
  return INITIAL_EVENTS
})()

export function createEventId() {
  return String(eventGuid++)
}

导入使用方式:

import initialEventsPromise from './你的模块文件名.js'

async function 你的业务函数() {
  const INITIAL_EVENTS = await initialEventsPromise
  // 此处即可拿到填充完数据的数组
}

解决方案2:导出getter方法(兼容同步场景)

如果需要兼容现有同步使用的代码,可以导出获取数组的方法,调用时取最新的数组内容:

let eventGuid = 0
let INITIAL_EVENTS = [];

function getDatas(){
  return fetch("http://localhost:3214/events")
    .then((data) => data.json())
    .catch((err) => console.log(err))
}

async function api(){
  const datas = await getDatas();
  datas.forEach(element => {
    INITIAL_EVENTS.push(element)
  });
}
api()

// 导出获取数组的方法,调用时返回最新内容
export function getInitialEvents() {
  return INITIAL_EVENTS
}

export function createEventId() {
  return String(eventGuid++)
}

注意:使用该方案需要保证调用getInitialEvents()时,异步请求已经执行完成,否则拿到的还是空数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:39:03