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

Tinymce编辑器手风琴菜单插件async异步实现问题咨询

如何在TinyMCE手风琴插件中使用async实现分步表单处理

需求概述

开发TinyMCE编辑器的手风琴菜单插件,核心需求如下:

  • 打开弹出表单后,先设置手风琴菜单条目,再设置对应菜单内容
  • 处理完指定数量的表单后立即将数据传递到编辑器,无需等待所有表单处理完成

实现方案(基于async/await)

1. 重构表单处理逻辑为异步函数

将表单的条目和内容设置逻辑封装成异步函数,强制保证操作顺序(先条目后内容):

// 异步处理单个手风琴项的条目与内容
async function processSingleAccordionItem(formData) {
  // 第一步:异步设置手风琴菜单条目(可替换为实际DOM操作/接口请求)
  const processedTitle = await setupAccordionTitle(formData.title);
  // 第二步:异步设置对应菜单内容
  const processedContent = await setupAccordionContent(formData.content);
  
  return { title: processedTitle, content: processedContent };
}

// 模拟条目设置的异步操作(实际开发中替换为真实逻辑)
function setupAccordionTitle(title) {
  return new Promise(resolve => {
    // 比如插入标题到临时DOM容器、校验格式等操作
    setTimeout(() => resolve(title.trim()), 100);
  });
}

// 模拟内容设置的异步操作
function setupAccordionContent(content) {
  return new Promise(resolve => {
    // 比如过滤HTML标签、渲染富文本内容等操作
    setTimeout(() => resolve(content), 100);
  });
}

2. 分批处理表单并实时传递数据

设置分批阈值(比如每处理2个表单就提交一次),遍历表单数据时,每完成一批就立即调用编辑器的插入/更新方法:

async function processFormsInBatches(formList, batchSize = 2) {
  const currentBatch = [];
  
  for (let i = 0; i < formList.length; i++) {
    // 异步处理单个表单项
    const item = await processSingleAccordionItem(formList[i]);
    currentBatch.push(item);
    
    // 达到分批阈值,或处理到最后一项时,立即传递数据到编辑器
    if ((i + 1) % batchSize === 0 || i === formList.length - 1) {
      await sendDataToEditor(currentBatch);
      currentBatch.length = 0; // 清空当前批次数据
    }
  }
}

// 异步传递数据到TinyMCE编辑器
async function sendDataToEditor(items) {
  return new Promise(resolve => {
    // 生成手风琴HTML结构
    const accordionHtml = buildAccordionHtml(items);
    // 插入到编辑器中
    tinymce.activeEditor.insertContent(accordionHtml);
    resolve();
  });
}

// 生成手风琴HTML的辅助函数
function buildAccordionHtml(items) {
  return items.map(item => `
    <div class="accordion-item">
      <h3 class="accordion-header">${item.title}</h3>
      <div class="accordion-body">${item.content}</div>
    </div>
  `).join('');
}

3. 在弹窗提交事件中触发异步分批处理

修改弹出表单的确认按钮逻辑,调用异步分批处理函数:

// 弹窗确认按钮点击事件
document.getElementById('submit-accordion-btn').addEventListener('click', async () => {
  // 收集所有表单数据(根据实际DOM结构调整)
  const formList = Array.from(document.querySelectorAll('.accordion-form')).map(form => ({
    title: form.querySelector('.title-input').value,
    content: form.querySelector('.content-textarea').value
  }));
  
  // 启动异步分批处理,这里设置每2个表单提交一次
  await processFormsInBatches(formList, 2);
  
  // 处理完成后关闭弹窗
  tinymce.activeEditor.windowManager.close();
});

关键说明

  • async/await保证顺序执行:通过await强制每个手风琴项的条目设置完成后,再处理内容,避免异步操作导致的顺序混乱
  • 分批提交逻辑:通过索引判断批量阈值,每完成指定数量的表单就立即插入编辑器,无需等待所有表单处理完毕
  • Promise封装异步操作:将DOM操作、格式校验等耗时逻辑封装为Promise,适配async/await的异步流程

内容的提问来源于stack exchange,提问作者Ismail ÇİLOĞLU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 20:00:58