Javascript 是否可以在context.sync之前对多个context.load进行排队?
我有一个Word段落对象的段落对象。我有一些段落和关键字索引的关键字范围。我想在文档中搜索并突出显示另一组关键字 问题是-关键字搜索是线性的。我必须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
加载
并同步
每个关键字的搜索结果。因此,如果一个关键字搜索需要约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。由于代码段本身在脚本实验室中工作,因此在代码段之前已清理并重新构造了代码。