我有以下代码来在文档中的某个段落中搜索某些文本,如果发现任何出现的内容,请选择第一个。
function navigateToWord(paragraphId, text){
Word.run(function (context) {
var ps = context.document.body.paragraphs;
context.load(ps, 'items');
return context.sync()
.then(function (){
let p = ps.items[paragraphId];
let results = p.search(text);
context.load(results, 'items');
return context.sync().then(function(){
if(results.items.length>0){
results.items[0].select();
}
}).then(context.sync);
});
});
}
这可以工作,但是速度非常慢,尤其是在Word Online上的较大文档上(Word Desktop的性能稍好)。我该如何改善?
我计划多次调用此代码(使用不同的输入参数),有没有一种方法可以缓存加载的属性,因此第二次调用相同的代码时,我不会不必等那么久?
答案 0 :(得分:1)
您正在加载的内容超出了您的需求。首先要注意一点:不需要在load命令中指定“项目”。当您具有集合对象的context.load时,会自动加载“ items”。因此,context.load(ps, 'items');
等效于context.load(ps);
,更重要的是,通过不指定其他任何属性,加载默认设置将加载包括文本在内的所有属性,因此所有段落的所有文本都将遍历整个网络。最佳实践是在load命令中指定所需的属性。但是,在您的情况下,您不需要任何内容,因此应将虚拟字符串作为要加载的第二个参数。这会阻止任何属性的加载。以下代码可以工作,并且应该更快,尤其是在Word Online中:
function navigateToWord(paragraphId, text){
Word.run(function (context) {
var ps = context.document.body.paragraphs;
context.load(ps, 'no-properties-needed');
return context.sync()
.then(function (){
let p = ps.items[paragraphId];
let results = p.search(text);
context.load(results, 'no-properties-needed');
return context.sync().then(function(){
if(results.items.length>0){
results.items[0].select();
}
}).then(context.sync);
});
});
}