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

Fullcalendar双Ajax回调问题:合并多源事件数据方案求助

解决Ajax异步获取多数据源并合并给FullCalendar的问题

嘿,这个异步回调的坑我之前踩过!核心问题就是两个Ajax请求是并行异步的,你没法保证哪个先完成,所以之前的代码会随机拿到其中一组数据就传给日历了。咱们用Promise.all(或者jQuery的$.when,如果你还在使用jQuery的话)就能完美解决,确保两个请求都完成后再合并数据初始化日历。

方法一:使用原生Promise + Fetch API

先把每个数据请求封装成返回Promise的函数,然后用Promise.all等待所有请求完成:

// 封装获取事件数据的函数
function fetchEvents() {
  return fetch('/your-events-api-url') // 替换成你的事件接口地址
    .then(response => {
      if (!response.ok) throw new Error('事件请求失败');
      return response.json();
    })
    .catch(err => {
      console.error('获取事件出错:', err);
      return []; // 失败时返回空数组,避免影响后续合并
    });
}

// 封装获取休假数据的函数
function fetchVacations() {
  return fetch('/your-vacations-api-url') // 替换成你的休假接口地址
    .then(response => {
      if (!response.ok) throw new Error('休假请求失败');
      return response.json();
    })
    .catch(err => {
      console.error('获取休假出错:', err);
      return [];
    });
}

// 等待两个请求都完成后处理
Promise.all([fetchEvents(), fetchVacations()])
  .then(([eventsData, vacaData]) => {
    // 合并两个数据源
    const combinedEvents = [...eventsData, ...vacaData];
    
    // 初始化FullCalendar
    document.addEventListener('DOMContentLoaded', function() {
      const calendarEl = document.getElementById('calendar');
      const calendar = new FullCalendar.Calendar(calendarEl, {
        // 你的日历基础配置
        headerToolbar: {
          left: 'prev,next today',
          center: 'title',
          right: 'dayGridMonth,timeGridWeek,timeGridDay'
        },
        // 传入合并后的事件数据
        events: combinedEvents,
        // 其他自定义配置...
      });
      calendar.render();
    });
  })
  .catch(globalErr => {
    console.error('全局请求错误:', globalErr);
  });

方法二:使用jQuery的$.when(如果你依赖jQuery)

如果你的项目还在使用jQuery的$.ajax,可以用$.when来等待多个请求完成:

// 封装事件请求
function fetchEvents() {
  return $.ajax({
    url: '/your-events-api-url',
    method: 'GET'
  }).fail(() => []); // 失败返回空数组
}

// 封装休假请求
function fetchVacations() {
  return $.ajax({
    url: '/your-vacations-api-url',
    method: 'GET'
  }).fail(() => []);
}

// 等待两个请求完成
$.when(fetchEvents(), fetchVacations())
  .done(function(eventsResponse, vacaResponse) {
    // 注意:jQuery的done回调中,每个请求的响应是包含数据的数组,取第一个元素
    const eventsData = eventsResponse[0];
    const vacaData = vacaResponse[0];
    const combinedEvents = [...eventsData, ...vacaData];
    
    // 初始化FullCalendar(jQuery版本)
    $('#calendar').fullCalendar({
      events: combinedEvents,
      // 其他配置...
    });
  })
  .fail(err => {
    console.error('请求失败:', err);
  });

关键原理

Promise.all和$.when都会等待所有传入的异步操作全部完成后才执行后续回调,这样就能确保你拿到的是两组完整的数据,再合并成一个数组传给FullCalendar,再也不会出现随机显示某一组数据的问题了。

额外提醒:别忘了在catch分支处理错误,避免某个请求失败导致整个日历无法加载哦!

内容的提问来源于stack exchange,提问作者Marek Špeta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:36:02