Повышение производительности поиска в Microsoft Word с использованием office-js - PullRequest
0 голосов
/ 29 июня 2018

У меня есть следующий код для поиска абзаца в документе по какому-либо тексту, и, если обнаружены какие-либо вхождения, выберите первый.

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 голосов
/ 29 июня 2018

Вы загружаете намного больше, чем вам нужно. Во-первых, второстепенный вопрос: указывать «элементы» в команде загрузки не нужно. 'items' автоматически загружаются, когда у вас есть context.load для объекта коллекции. Таким образом, context.load(ps, 'items'); эквивалентно context.load(ps); Что еще более важно, не задавая никаких других свойств, загрузите значения по умолчанию для загрузки всех свойств, включая текст, поэтому весь текст всех ваших абзацев проходит по проводам. Рекомендуется указывать свойства, которые вам нужны в команде загрузки. В вашем случае, однако, вам не нужно ничего, поэтому вы должны поместить фиктивную строку в качестве второго параметра для загрузки. Это блокирует загрузку любых свойств. Следующий код работает и должен быть намного быстрее, особенно в 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);
        });

    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...