【问题标题】:Further looking into "Avoid context.sync in loops"进一步研究“在循环中避免 context.sync”
【发布时间】:2020-06-09 11:38:54
【问题描述】:

Article Avoid using the context.sync method in loops 对我正在开发的 Word 插件提供了难以置信的帮助。采用本文介绍的技术后,我看到了巨大的性能提升。

这真的让我很开心。现在只剩下一个同步循环,我不知道如何处理它。这是示例代码。带有 context.sync() 的罪魁祸首函数在一个循环中运行,形成了让我发疯的同步循环。知道如何优化它吗?由于某种原因,这两个函数无法合并。

async function testFunc (ranges: Word.RangeCollection) {
  for (let i=0; i<1000; i++) {
    await culprit(ranges.items[i]);
  }
}
async function culprit (range: Word.Range) {
  range.load("text");
  await range.context.sync();
}

【问题讨论】:

  • 尝试循环加载,上下文同步,然后在第二个循环中读取实际文本。
  • 正如@blackening 建议的那样,从culprit 中剪下await range.context.sync(); 行并将其插入到调用 culprit 的行之后。
  • @blackening 假设您的建议有效,请将其设为答案而不是评论,以便在 Stack 的统计信息中计为已回答。
  • @RickKirkham 谢谢。在没有测试的情况下推荐一些东西犹豫不决。很久没有在 office-js 上工作了。

标签: office-js word-addins


【解决方案1】:

尝试循环加载,上下文同步,然后在第二个循环中读取实际文本。

(注:未测试,但似乎在 cmets 中有正面反馈。)

基本上:

async function testFunc (ranges: Word.RangeCollection) {
  for (let i=0; i<1000; i++) {
    ranges.items[i].load('text');
  }
  await context.sync()
  for (let i=0; i<1000; i++) {
    // read the text here
  }
}

【讨论】:

  • 谢谢。在我的情况下,testFunc 的实际代码具有三层循环,并且在最内层循环中调用了罪魁祸首函数。每一级循环都有附加的变量代码。根据您使用文章中描述的技术的建议,我最终重组了我的代码以将 sync() 拖出三个级别的循环。感谢文章和您的建议,我已经掌握了本文介绍的技术。
猜你喜欢
  • 2023-01-28
  • 2010-10-22
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
相关资源
最近更新 更多