Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以在context.sync之前对多个context.load进行排队?_Javascript_Ms Word_Office Js - Fatal编程技术网

Javascript 是否可以在context.sync之前对多个context.load进行排队?

Javascript 是否可以在context.sync之前对多个context.load进行排队?,javascript,ms-word,office-js,Javascript,Ms Word,Office Js,我有一个Word段落对象的段落对象。我有一些段落和关键字索引的关键字范围。我想在文档中搜索并突出显示另一组关键字 问题是-关键字搜索是线性的。我必须加载并同步每个关键字的搜索结果。因此,如果一个关键字搜索需要约300毫秒,15次搜索需要约4500秒。我想并行执行所有关键字搜索加载同步操作,因此我在大约300毫秒内获得所有结果,与关键字数组的大小无关 代码示例如下: let paragraphObjects = [] let keywordsObject = { "2": { "key

我有一个Word段落对象的段落对象。我有一些段落和关键字索引的关键字范围。我想在文档中搜索并突出显示另一组关键字

问题是-关键字搜索是线性的。我必须
加载
同步
每个关键字的搜索结果。因此,如果一个关键字搜索需要约300毫秒,15次搜索需要约4500秒。我想并行执行所有关键字搜索加载同步操作,因此我在大约300毫秒内获得所有结果,与关键字数组的大小无关

代码示例如下:

let paragraphObjects = []
let keywordsObject = {
  "2": {
    "keywords": ["the", "which", "eye"]
  },
  "4": {
    "keywords": ["lorem", "ipsum"]
  },
  "9": {
    "keywords": ["hellow", "world", "foo", "bar"]
  }
}
let keywordRanges = []
let searchKeywordResults = []

Word.run((context) => {

  var paragraphs = context.document.body.paragraphs

  context.load(paragraphs, 'text, font, style');

  return context.sync().then(() => {
    for (var i = 0; i < paragraphs.items.length; i++) {
      paragraphObjects.push(paragraphs.items[i])
    }

    $.each(keywordsObject, (divId, divValue) => {
      $.each(divValue.keywords, (idx, keyword) => {
        var obj = { paragraphObject: pa[currentParaIndex], keyword: keyword }
        keywordRanges.push(obj)
      })
    })
  })
  .then(() => {
    if (keywordRanges.length > 0) {
      $.each(keywordRanges, (idx, obj) => {
        var paragraphObject = obj.paragraphObject
        var keyword = obj.keyword
        searchKeywordResults[idx] = paragraphObject.search(keyword, { matchWholeWord: true })
      })

      let highlight = async() => {
        for (let i = 0; i < searchKeywordResults.length; i++) {
          context.load(searchKeywordResults[i], 'text, font')
          await context.sync() // each iteration takes around 300 milliseconds. 
        }

        for (let i = 0; i < searchKeywordResults.length; i++) {
          for (let j = 0; j < searchKeywordResults[i].items.length; j++) {
            searchKeywordResults[i].items[j].font.highlightColor = highlightColorValue
          }
        }

        await context.sync()
        return
      }

      highlight()
    }
  })
})
让paragraphObjects=[]
让关键字对象={
"2": {
“关键词”:[“the”,“which”,“eye”]
},
"4": {
“关键词”:[“lorem”、“ipsum”]
},
"9": {
“关键词”:[“hellow”、“world”、“foo”、“bar”]
}
}
let关键字范围=[]
让searchKeywordResults=[]
Word.run((上下文)=>{
var段落=context.document.body.parations
加载(段落,“文本、字体、样式”);
返回context.sync()。然后(()=>{
对于(变量i=0;i{
$.each(divValue.keywords,(idx,keyword)=>{
var obj={paragraphObject:pa[currentParaIndex],关键字:关键字}
关键字范围。推送(obj)
})
})
})
.然后(()=>{
如果(关键字ranges.length>0){
$.each(关键字范围,(idx,obj)=>{
var paragraphObject=obj.paragraphObject
var关键字=obj.keyword
searchKeywordResults[idx]=paragraphObject.search(关键字,{matchWholeWord:true})
})
让highlight=async()=>{
for(设i=0;i
我想用替换此代码

for (let i = 0; i < searchKeywordResults.length; i++) {
    context.load(searchKeywordResults[i], 'text, font')
    await context.sync() 
}
for(设i=0;i
用这个

for (let i = 0; i < searchKeywordResults.length; i++) {
    context.load(searchKeywordResults[i], 'text, font')
}
await context.sync()
for(设i=0;i

有可能吗?

是的,在一个
同步中对多个操作进行排队
是Office 2016+API浪潮批处理模型的重要组成部分

举一个非常简单的Excel示例:

async function run() {
    try {
        await Excel.run(async (context) => {
            let sheet = context.workbook.worksheets.getItem("Sheet1");
            let a1 = sheet.getRange("A1");
            let b2 = sheet.getRange("B2");
            let c3 = sheet.getRange("C3");

            [a1, b2, c3].forEach(range => range.load("values"));

            await context.sync();

            [a1, b2, c3].forEach(range => console.log(range.values[0][0]));
        });
    }
    catch (error) {
        OfficeHelpers.UI.notify(error);
        OfficeHelpers.Utilities.log(error);
    }
}
所以,它肯定会起作用。当你尝试这样的事情时,是否会出错

FWIW(免责声明,我是这本书的作者):我想你会在“Building Office Add-in using Office.js”一书中找到很多关于加载和批处理的有用信息,这本书可以从以下网址获得。特别是第5章——关于Office.js的基础知识——目前包括以下章节,所有章节都专门讨论代理对象、加载和同步:


第二种情况似乎不起作用。当我尝试迭代搜索关键字results.items时,它显示
ItemNotFound
错误。但是,它在第一种情况下可以工作。如果您可以提供完整的代码段(使用安装方法填充一些数据,然后是您的实际测试代码,所有这些代码都可以一次性单击以进行调试),那么这将是最简单的。最好的方法是通过分享片段作为要点。一旦我们有了它,我可以快速浏览一下,并/或将其传递给Word团队的开发人员?您是使用Office 2016的MSI安装,还是基于订阅的安装?()。我更改了代码,将所有内容都包装为异步,现在它可以工作了。谢谢摘自您的书“关于在承诺中等待(或返回)的部分非常关键。只需在函数体中调用context.sync(),而不等待/返回它,将导致任何错误,从被默默吞没到一切完全出错。”其中一个context.sync某处未
await
ed。由于代码段本身在脚本实验室中工作,因此在代码段之前已清理并重新构造了代码。