使事件处理程序无缝?

Make an event handler seamless?

我在Excel online add-in下写了一个事件处理器。它由按钮 activate 激活,然后当用户单击另一个单元格或范围时,地址将被写入文本区域 myTextArea。一切正常。

但是,一旦选择了新的单元格,焦点附近就会显示一个绿色的加载符号; WORKING...显示在Excel的底部;几乎需要 0.5 second.

我很惊讶这么简单的动作需要时间。有谁知道是否可以使此事件处理程序更快?否则,除了事件处理之外,还有其他方法可以做到这一点吗?

(function() {
    "use strict";

    Office.initialize = function(reason) {
        $(document).ready(function() {
            app.initialize();            
            $('#activate').click(addSelectionChangedEventHandler);
        });
    }
    ;

    function addSelectionChangedEventHandler() {
        Office.context.document.addHandlerAsync(Office.EventType.DocumentSelectionChanged, MyHandler);
    }

    function MyHandler(eventArgs) {
        doStuffWithNewSelection();
    }

    function doStuffWithNewSelection() {
        Excel.run(function(ctx) {
            var selectedRange = ctx.workbook.getSelectedRange();
            selectedRange.load(["address"]);
            return ctx.sync().then(function() {
                write(selectedRange.address)
            })
        }).then(function() {
            console.log("done");
        }).catch(function(error) {
           ...
        });
    }    

    function write(message) {
       document.getElementById("myTextarea").value = message;
    }
})();

您看到的是网络延迟。选择更改事件 - 一旦注册 - 起源于服务器,并触发代码 if Office.js 触发您的事件处理程序。反过来,您的事件处理程序会创建一个本地请求以获取选择范围对象及其地址,将其作为 ctx.sync() 的一部分发送到服务器,然后在触发 [=] 之前等待服务器的回复11=].

您无法做任何事情来优化此流程——您将在 Excel 在线支付相当高的每笔交易成本,而事件处理程序只会在该成本上增加一个额外的步骤。另一方面,好消息是基于 Excel.run/ctx 的模型确实允许您将多个请求合并为一个请求,从而大大减少了否则所需的往返次数。也就是说,获取 10 个不同范围的值与只获取一个范围的速度几乎相同;而如果每次调用都是单独进行的,费用会高出 10 倍。

希望对您有所帮助!

~ Michael Zlatkovsky,Office 可扩展性团队开发人员,MSFT