我正在使用Word加载项,需要用从API获取的值替换整个文档中的大量代码。我是新来的诺言者,在让替换品按顺序运行时遇到了问题,因此位置不会受到干扰,不会错过替换品。到目前为止,我最好的刺法是:

function merge(documentFieldKeys) {
    if (documentFieldKeys.length > 0)
        Word.run(function(context) {
            var key = documentFieldKeys.shift();
            var results = context.document.body.search(key.Code, { matchWholeWord: false, matchCase: false });
            context.load(results);
            return context.sync().then(function() {
                    if (results.items.length > 0 && key.Value === "") {
                        missingFields.push(key.Description);
                    } else {
                        for (var i = 0; i < results.items.length; i++) {
                            results.items[i].insertText(key.Value, "replace");
                        }
                    }
                })
                .then(context.sync).then(merge(documentFieldKeys));
        });
}


根据我对诺言的理解,它应该处理第一个项目,然后在完成后将简短清单传递给另一个人。但是,它们的执行顺序似乎是随机的。知道有什么问题吗?

最佳答案

问题是.then(merge(documentFieldKeys))。这意味着您正在立即调用合并功能。您要做的是:

.then(function() { return merge(documentFieldKeys);}).then(context.sync);

更新:

注意:第二个.then(context.sync)是可选的,实际上并不需要它,因为Word.run仍然会在末尾刷新队列。但我发现它更干净。

另外,它的价值是:我写了一本有关Office.js的书,名为“ Building Office Add-ins using Office.js”。在其中,我包括有关Promises的长篇入门文章,以及TypeScript和async/await,这使Promises的使用更加容易。本书以https://leanpub.com/buildingofficeaddinsall profits to charity的电子书形式提供。

关于javascript - Word API JS的保证运行保证顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50883874/

10-11 03:14