Outlook WebAddin在注册Office.EventType.ItemChanged时抛出内部服务器错误

时间:2018-06-12 13:25:43

标签: javascript office-js outlook-web-addins outlook-for-mac

在我的Outlook WebAddin中,我正在尝试使用以下代码注册邮件ItemChange事件。

    Office.context.mailbox.addHandlerAsync(Office.EventType.ItemChanged, mailItemSelectionChanged, [], function (result) {
            if(result && result.status != 'succeeded'){
                console.error('result => ' + result);
             }
});

每当用户在固定模式下更改邮件时,我都会第一次收到邮件更改事件。然后,如果对话发生变化,我将使用 location.reload()重新加载插件以清除缓存并加载新的插件。

重新加载插件后,它无法注册mailItemChange事件并抛出以下错误:

  

{"代码":5001,"消息":"发生内部错误。","名称":   "内部错误"}

它在浏览器和一些Windows机器中失败(在许多其他情况下工作)。

outlookDiagnostics

  

{" host":" Outlook"," platform":" OfficeOnline"," version":   " 16.0.9215.1000"}

1 个答案:

答案 0 :(得分:2)

我可以找出有关Office.EventType.ItemChanged事件注册的以下行为:

  1. 您不能注册多个事件处理程序。多数人在第二次尝试注册事件处理程序时都遇到错误,从而使第一个事件处理程序未注销。
  2. 事件处理程序的注册有效期已超出外接程序网页的有效期。这意味着当您的加载项卸载当前网页并重新加载相同或不同的网页(即它导航到另一个网页)时,事件处理程序的注册仍将保留。
  3. 在取消注册事件处理程序时,您不仅必须提供处理程序函数的名称,而且还必须确保该函数与用于注册事件的函数完全相同。换句话说,如果您尝试在重新加载网页之后注销事件处理程序,则处理程序功能的对象是不同的,因此事件处理程序不会被注销。
  4. Outlook关闭加载项窗格时,事件处理程序注册会丢失。

因此,根据您的情况,您需要在调用location.reload()之前注销事件,如下所示。

Office.context.mailbox.removeHandlerAsync(Office.EventType.ItemChanged, {handler: mailItemSelectionChanged}, function(result) {
    if (result.status === Office.AsyncResultStatus.Failed) {
        console.log('Item Change event could not be unregistered.');
        console.log(result.error);
    }
    else {
        console.log('Item Change event unregistered successfully.');
    }
});
setTimeout(function() {location.reload();}, 100);

那些想要从其外接程序导航到相同或另一个网页的人,他们可以将click事件处理程序附加到锚标记(或按钮),以确保在当前事件之前已注销ItemChanged事件处理程序。页面已卸载。我使用以下代码完成了此操作:

$(document).ready(function() {
    $('.NavBarContainer a').toArray().forEach(function(anchor1, index) {
        $(anchor1).click(function(event) {
            if(itemChangeEventRegistered) {
                unregisterItemChangeHandler();
                setTimeout(function() {window.location = anchor1.href;}, 100);
                return false;
            }
            return true;
        });
    });
});