outlook - 在 Office.js 中,我们如何使用 Office.context.mailbox.item.saveAsync 响应(克服 ErrorItemNotFound)?
问题描述
医生说:
注意:如果您的加载项在撰写模式下对项目调用 saveAsync 以获取项目 ID 以与 EWS 或 REST API 一起使用,请注意,当 Outlook 处于缓存模式时,可能需要一些时间才能使项目实际同步到服务器。在项目同步之前,使用 itemId 将返回错误。
据我所知,这就是我尝试使用该 ID时出现ErrorItemNotFound问题的原因?(很遗憾微软没有具体告诉我们会发生什么错误)。
由于我的代码是异步调用的 - 我究竟如何等待注明的“某个时间”?我们是否设置了一个计时器以每秒重试一次?我们什么时候放弃??当项目同步完成时,我还能做些什么来给我回电以继续?[仅供参考-即使在保存后等待 10 秒也不适合我]
请注意,我希望我的用户可能正在撰写带有大附件的邮件,因此虽然大多数无附件邮件应该在 1 秒内同步,但附加大 pdf/zip/etc 文件的人很容易在这里造成超过 1 分钟的延迟。 .
解决方案
您可以做的最好的事情是开始轮询出现在服务器端的项目。例如,当您使用带有您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
如果项目是在交换时创建的,则该请求应返回。
推荐阅读
- python - 我们应该使用同一个 mongod 服务器连接到多个数据库吗?
- java - 二维数组中带空格的字符串输入
- html - 未找到自定义光标的 URL
- excel - 如何保留复制和粘贴功能而不必将数据存储在变量中?
- windows - `explorer.exe .` 在 Windows 1903 中打开 System32 目录
- datetime - 如何在xquery中将没有格式的字符串转换为dateTime
- arrays - 如何比较数组中的时间?
- javascript - 尝试将 php 表转换为 pdf 格式 - 使用 jsPDF-auto-table 将 php 查询的结果(多条记录)转换为格式良好的 pdf 文件
- spring-mvc - 如何将 Spring 配置为忽略 SSL 证书有效性
- eclipse - Eclipse 服务器项目(Tomcat)的 IntelliJ Ultimate 等效项?