我想开发一个Word Addinn。通过它,我可以浏览 Word 文档的段落并自定义文档的格式。我想将单词的元音涂成红色。我已经开发了一个原型。然而,这并不是特别快,因为所有内容都是同步处理的。我还没有找到异步执行处理的方法。
有效
export async function run() {
return await Word.run(async (context) => {
const start = performance.now();
const paragraphs = context.document.body.paragraphs;
paragraphs.load("text");
await context.sync();
for (let i = 0; i < paragraphs.items.length; i++) {
const paragraph = paragraphs.items[i];
if (paragraph.text) {
const wordsRangeCollection = paragraph.getRange().split([" "]);
wordsRangeCollection.load("$none");
await wordsRangeCollection.context.sync();
console.log(wordsRangeCollection.items);
}
}
await context.sync();
const end = performance.now();
console.log(`Execution time: ${end - start} ms`);
});
}
不工作
失败
word-web-16.00.js:25 未捕获(承诺)RichApi.Error
export async function run() {
return await Word.run(async (context) => {
const start = performance.now();
const paragraphs = context.document.body.paragraphs;
paragraphs.load("text");
await context.sync();
await Promise.all(
paragraphs.items.map(async (paragraph) => {
if (paragraph.text) {
const wordsRangeCollection = paragraph.getRange().split([" "]);
wordsRangeCollection.load("$none");
await wordsRangeCollection.context.sync();
console.log(wordsRangeCollection.items);
}
})
);
await context.sync();
const end = performance.now();
console.log(`Execution time: ${end - start} ms`);
});
}
您的两个实现都有一个循环中的
context.sync
。 (map
方法是变相的循环。)这是一个性能杀手。请使用本文中的技术使 context.sync
脱离循环:避免在循环中使用 context.sync 方法。