保证承诺运行的顺序,Word API JS

时间:2018-06-15 23:46:54

标签: javascript ms-word promise ms-office office-js

我正在使用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));
        });
}

根据我对承诺的理解,它应该处理第一个项目,然后一旦完成通过短路列表进行另一个替换。但是,它们看起来是随机的。知道什么可能是错的吗?

1 个答案:

答案 0 :(得分:1)

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

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

<强>更新

注意:第二个.then(context.sync)是可选的,您实际上并不需要它,因为Word.run无论如何都会在末尾刷新队列。但是我发现它显得更清晰。

另外,为了它的价值:我已经写了一本关于Office.js的书,&#34; Building Office Add-ins using Office.js&#34;。在其中,我在Promises上添加了一个很长的入门,以及TypeScript和async/await,这使得使用Promise变得更加容易。该书以https://leanpub.com/buildingofficeaddins的电子书形式提供,all profits to charity