首页 > 解决方案 > 在 Office.js 中,我们如何使用 Office.context.mailbox.item.saveAsync 响应(克服 ErrorItemNotFound)?

问题描述

医生

注意:如果您的加载项在撰写模式下对项目调用 saveAsync 以获取项目 ID 以与 EWS 或 REST API 一起使用,请注意,当 Outlook 处于缓存模式时,可能需要一些时间才能使项目实际同步到服务器。在项目同步之前,使用 itemId 将返回错误。

据我所知,这就是我尝试使用该 ID时出现ErrorItemNotFound问题的原因?(很遗憾微软没有具体告诉我们会发生什么错误)。

由于我的代码是异步调用的 - 我究竟如何等待注明的“某个时间”?我们是否设置了一个计时器以每秒重试一次?我们什么时候放弃??当项目同步完成时,我还能做些什么来给我回电以继续?[仅供参考-即使在保存后等待 10 秒也不适合我]

请注意,我希望我的用户可能正在撰写带有大附件的邮件,因此虽然大多数无附件邮件应该在 1 秒内同步,但附加大 pdf/zip/etc 文件的人很容易在这里造成超过 1 分钟的延迟。 .

标签: outlookoffice-jsoutlook-addinexchangewebservicesoutlook-web-addins

解决方案


您可以做的最好的事情是开始轮询出现在服务器端的项目。例如,当您使用带有您saveAsync在循环中获得的 Id 的子顺序 EWS 查询并等待成功时,您可能会尝试一个丑陋的解决方案。

例如,我注意到以下示例开发人员如何尝试处理此类场景:

app.makeEwsRequestAsync = function (request, callback, countRepeatIfCrash, callbackIfCrash) {
        try {
            Office.context.mailbox.makeEwsRequestAsync(request, function (asyncResult) {
                
                try {
                    
                    if (asyncResult.status !== 'succeeded') {
                        app.showError(asyncResult.error.message);
                        return;
                    } else {
                        var $result = app.getResponseElementByName(asyncResult.value, 'm:ResponseCode');
                        
                        if ($result) {
                            var responseCOde = $result.text();
                            if (responseCOde !== 'NoError') {
                                if (countRepeatIfCrash > 0) {
                                    setTimeout(function () {
                                        app.makeEwsRequestAsync(request, callback, countRepeatIfCrash - 1);
                                    }, 500);
                                } else if (callbackIfCrash) {
                                    setTimeout(function() {
                                        callbackIfCrash();
                                    }, 500);
                                } else if (responseCOde === 'ErrorItemNotFound') {
                                    app.showError('EWS ' + responseCOde, function () {
                                        app.makeEwsRequestAsync(request, callback, 70);
                                    });
                                }
                                else {
                                    app.showError('EWS ' + responseCOde);
                                }
                                return;
                            }
                        }
                    }
                    
                    callback(asyncResult);

                } catch (e) {
                    app.showError(e);
                }
            });
        } catch (e) {
            app.showError(e);
        }        
    }

有关详细信息,请参阅适用于 Outlook 的应用程序:EWS 请求失败,项目 ID 由 item.saveAsync 返回

您也可以尝试使用简单的GetItem请求:

<GetItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages">
    <ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
    </ItemShape>
    <ItemIds><t:ItemId Id="' + itemId + '"/></ItemIds>
</GetItem>

ChangeKey如果项目是在交换时创建的,则该请求应返回。


推荐阅读