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

Fullcalendar异步加载事件源:能否先渲染已加载的数据源?

当然可以!这种场景在做数据驱动的UI时太常见了——核心就是别把两个请求的结果绑死在一起等待,而是让它们并行发起请求,各自加载完成后就立刻更新日历,不用等另一个接口返回。

具体实现思路

1. 并行发起两个请求

不用等第一个接口返回再调用第二个,两个请求同时启动,最大化利用时间。

2. 独立处理每个请求的回调

每个接口返回数据后,直接调用日历的渲染/事件添加逻辑,快的数据源先渲染,慢的数据源加载完成后再补充进去。

3. 别忘了错误处理

给每个请求单独加错误捕获,避免其中一个接口失败导致整个日历无法正常展示。

代码示例(原生JS)

假设你用的是自定义日历逻辑,核心代码大概是这样:

// 模拟两个接口请求
function fetchFastEvents() {
  return new Promise(resolve => setTimeout(() => {
    resolve([{ title: "团队周会", date: "2024-05-22" }]);
  }, 1000)); // 快接口1秒返回
}

function fetchSlowEvents() {
  return new Promise(resolve => setTimeout(() => {
    resolve([{ title: "客户拜访", date: "2024-05-23" }]);
  }, 3000)); // 慢接口3秒返回
}

// 初始化空日历框架
function renderEmptyCalendar() {
  console.log("渲染日历基础结构");
  // 这里是渲染日历容器、表头之类的基础逻辑
}

// 向日历添加事件
function addEventsToCalendar(events) {
  console.log("添加事件到日历:", events);
  // 替换成你的日历事件添加逻辑,比如插入DOM节点或调用日历库API
}

// 主流程
renderEmptyCalendar();

// 处理快接口
fetchFastEvents()
  .then(events => addEventsToCalendar(events))
  .catch(err => console.error("快接口加载失败:", err));

// 处理慢接口
fetchSlowEvents()
  .then(events => addEventsToCalendar(events))
  .catch(err => console.error("慢接口加载失败:", err));
主流日历库适配(以FullCalendar为例)

如果用的是成熟的日历库,它们一般都支持动态添加事件源,不用自己写DOM操作:

// 初始化日历
const calendar = new FullCalendar.Calendar(document.getElementById("calendar"), {
  initialView: "dayGridMonth",
  // 其他日历配置...
});

// 先渲染空日历
calendar.render();

// 加载快数据源并添加
fetch("/fast-endpoint")
  .then(res => res.json())
  .then(events => calendar.addEventSource(events));

// 加载慢数据源并添加
fetch("/slow-endpoint")
  .then(res => res.json())
  .then(events => calendar.addEventSource(events));

这样用户打开页面后,先看到空日历,1秒后快接口的事件显示出来,再过2秒慢接口的事件自动补充进去,体验会比原来等待3秒才看到内容流畅很多~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:24:59