提高使用office-js搜索Microsoft Word的性能

时间:2018-06-29 11:47:56

标签: javascript office-js

我有以下代码来在文档中的某个段落中搜索某些文本,如果发现任何出现的内容,请选择第一个。

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的性能稍好)。我该如何改善?

我计划多次调用此代码(使用不同的输入参数),有没有一种方法可以缓存加载的属性,因此第二次调用相同的代码时,我不会不必等那么久?

1 个答案:

答案 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);
        });

    });
}