Office JS - 无法从 for 循环中获取 context.sync(),这会影响性能

问题描述 投票:0回答:1

我目前正在使用 office javascript 库开发一个 word 插件。

以下函数旨在将文档文本拆分为句子,同时确保这些句子可以跨段落(内置库函数(

getTextRanges()
)在段落标记上拆分,无论分隔符(在本例中为“.”)存在。本质上,我只想根据下一个“。”的时间将文档文本分成句子。还包含一些代码来保护某些“。”不被解释为句子的结尾(例如,如果你在句子中间引用第 7.4 节你不希望它把它当作句子的结尾)。

我有一个 for 循环,用于搜索

getTextRanges()
函数所做的每个句子。它比较相邻的句子,如果两者都不包含“。”它将句子(范围)合并为一个句子(范围)。然后它会不断检查
getTextRanges()
的下一个范围,直到出现“.”。存在,包括带有“.”的范围作为合并范围中的最终范围。然后它会重置并从
getTextRanges()
的下一个范围开始该过程,直到从
getTextRanges()
开始的每个范围都已循环。

问题是,出于某种原因,我无法将

await context.sync()
移出 for 循环,而不会产生无法加载“文本”属性的错误。将它出现在 for 循环中会大大降低性能。我试图按照本指南来拆分循环:https://learn.microsoft.com/en-us/office/dev/add-ins/concepts/correlated-objects-pattern。但是,问题似乎出在创建合并范围的
expandTo
函数中。在没有调用 context.sync() 之前,无法将合并范围分配或推送到数组。

任何正确方向的帮助或推动将不胜感激。

NB:对不起,我的 JS 技能明显不好,我很新,还在学习。

这是我的全部功能:

var global_sentences3_text = []
var global_sentences3_ranges = []
var global_sentences_real = null
async function realsentenizer() {
  await Word.run(async (context) => {
    const body = context.document.body.getRange();
    body.load("text");
    await context.sync();

    //making sure we are not splitting on period in these cases: "clause 5.6" or "registration no. 555"
    var ranges_to_protect = body.search("[0-99].[0-99]", {matchWildcards: true, matchCase: false})
    var ranges_to_protect2 = body.search("[Nn][Oo].", {matchWildcards: true, matchCase: false})

    ranges_to_protect.load('text')
    ranges_to_protect2.load('text')
    await context.sync()

    var saved_text = []
    var saved_text2 = []
    for (let i = 0; i < ranges_to_protect.items.length ; i++) {
      saved_text.push(ranges_to_protect.items[i].text)
      ranges_to_protect.items[i].insertText('[PROTECTEDDOT]','Replace')
    }

    for (let i = 0; i < ranges_to_protect2.items.length ; i++) {
      saved_text2.push(ranges_to_protect2.items[i].text)
      ranges_to_protect2.items[i].insertText('[PROTECTEDDOT]','Replace')
    }

    //splitting bodytext on "."
    const sentences = body.getTextRanges(["."], false);
    sentences.load('text')
    
    global_sentences_real = sentences
    
    await context.sync();

    const new_ranges =[]
    var saved_range = sentences.items[0]

    // Loop through the ranges, checking adjacent pairs
    for (let i = 1; i < sentences.items.length ; i++) {

      if (sentences.items[i].text.includes(".") == false && saved_range.text.includes(".") == false){
        console.log('CHANGED')
        const extended_range = saved_range.expandTo(sentences.items[i])
        extended_range.load('text')
        await context.sync()

        saved_range = extended_range
      } else {
        console.log('NOT CHANGED')
        const extended_range2 = saved_range.expandTo(sentences.items[i])
        extended_range2.load('text')
        await context.sync()

        new_ranges.push(extended_range2)
        saved_range = sentences.items[i+1]
      }
    }

    for (let i = 0; i < ranges_to_protect.items.length ; i++) {
      ranges_to_protect.items[i].insertText(saved_text[i],'Replace')
    }
    for (let i = 0; i < ranges_to_protect2.items.length ; i++) {
      ranges_to_protect2.items[i].insertText(saved_text2[i],'Replace')
    }
    
    await context.sync()

    for (let sentence of new_ranges) {
      sentence.load('text')
      await context.sync()
      global_sentences3_text.push(sentence.text)
      sentence.track()
      global_sentences3_ranges.push(sentence)
    }

    global_sentences_real.track()
    
  await context.sync()
  console.log('Succesfully sentenized')
  });
}

这是生成问题的 for 循环:

const new_ranges =[]
    var saved_range = sentences.items[0]

    // Loop through the ranges, checking adjacent pairs
    for (let i = 1; i < sentences.items.length ; i++) {

      if (sentences.items[i].text.includes(".") == false && saved_range.text.includes(".") == false){
        console.log('CHANGED')
        const extended_range = saved_range.expandTo(sentences.items[i])
        extended_range.load('text')
        await context.sync()

        saved_range = extended_range
      } else {
        console.log('NOT CHANGED')
        const extended_range2 = saved_range.expandTo(sentences.items[i])
        extended_range2.load('text')
        await context.sync()

        new_ranges.push(extended_range2)
        saved_range = sentences.items[i+1]
      }
    }

T

ms-word office-js office-addins word-addins word-web-addins
1个回答
0
投票

这太复杂了,无法发表评论,但我可以根据需要稍后进行编辑。如果将第二个代码块中的代码替换为以下代码,看看会发生什么:

const new_ranges =[]
let saved_range = sentences.items[0]

let extended_range = {};

// Loop through the ranges, checking adjacent pairs
for (let i = 1; i < sentences.items.length ; i++) {

  if (sentences.items[i].text.includes(".") == false && saved_range.text.includes(".") == false){
    console.log('CHANGED')
    extended_range = saved_range.expandTo(sentences.items[i])
    extended_range.load('text')
    saved_range = extended_range
  } else {
    console.log('NOT CHANGED')
    extended_range = saved_range.expandTo(sentences.items[i])
    extended_range.load('text')
    new_ranges.push(extended_range)
    saved_range = sentences.items[i+1]
  }      
}    
await context.sync();
© www.soinside.com 2019 - 2024. All rights reserved.