Word Office JavaScript API性能优化:异步处理段落报错求助
问题分析
你的异步代码触发RichApi.Error的核心原因是:Office JavaScript API 的context.sync()不支持并行调用。每个sync()都会向Word服务端发送一批操作请求,并行触发多个sync()会导致上下文状态冲突,直接引发错误。
解决方案
Office JS性能优化的核心逻辑是尽可能减少context.sync()的调用次数,优先批量处理操作而非单次循环单独同步。针对你的需求,优化思路如下:
- 先批量获取所有段落并加载必要属性
- 遍历段落,一次性创建所有需要拆分的单词范围集合,统一标记需要加载的属性
- 仅调用一次
context.sync()获取所有单词范围的数据 - 最后批量处理单词的格式设置(将元音字母标红)
优化后的可运行代码
export async function run() { return await Word.run(async (context) => { const start = performance.now(); // 1. 获取所有段落并加载text属性 const paragraphs = context.document.body.paragraphs; paragraphs.load("text"); await context.sync(); // 2. 批量收集所有单词范围集合,统一标记加载 const wordRangeCollections = []; for (const paragraph of paragraphs.items) { if (paragraph.text.trim()) { const wordsRangeCollection = paragraph.getRange().split([" "]); wordsRangeCollection.load("$none"); // 仅加载对象引用,无需额外属性 wordRangeCollections.push(wordsRangeCollection); } } // 3. 一次性同步所有请求,获取所有单词范围数据 await context.sync(); // 4. 并行处理单词的元音标红操作(已获取数据,无需再触发sync) await Promise.all( wordRangeCollections.map(async (wordsRangeCollection) => { for (const wordRange of wordsRangeCollection.items) { const wordText = await wordRange.getText(); const vowels = /[aeiouAEIOU]/g; let match; // 遍历单词中的元音字母,设置为红色 while ((match = vowels.exec(wordText))) { const vowelRange = wordRange.getRange(match.index, match.index + 1); vowelRange.font.color = "red"; } } }) ); // 最后同步所有格式修改到文档 await context.sync(); const end = performance.now(); console.log(`执行时间: ${end - start} ms`); }); }
关键注意事项
- 绝对不要在并行Promise中调用
context.sync():所有需要从服务端拉取的数据,都要先批量标记加载,再一次性同步 - 减少sync次数是性能提升的核心:每一次
sync()都是一次网络请求,次数越少,整体执行速度越快 - 格式修改可并行处理:当已获取所有范围对象的本地引用后,修改格式的操作可以并行执行,最后统一同步提交修改
内容的提问来源于stack exchange,提问作者Tino Hager
相关产品推荐
相关产品推荐

