问题描述
DOC表示:
注意:如果您的外接程序在撰写模式下对项目调用saveAsync,以便获得与EWS或REST API一起使用的项目ID,请注意,当Outlook处于缓存模式时,可能需要一些时间才能将项目实际同步到服务器。在项目同步之前,使用ItemID将返回错误。
据我所知,这就是我尝试使用该ID时出现ErrorItemNotFound问题的原因?(很遗憾,Microsoft没有明确告诉我们会出现什么错误)。
由于我的代码是异步调用的-我到底应该如何等待注意到的某个时间";?我们是否设置了计时器来每一秒重试一次?我们什么时候放弃??当项目同步完成时,我还能做些什么来给我一个回叫以继续?[仅供参考-即使在保存后等待10秒对我也不起作用]
请注意,我预计我的用户可能正在撰写带有较大附件的邮件,因此,尽管大多数无附件邮件应在1秒内同步,但附件较大的pdf/压缩/等文件的人员在此很容易导致超过1分钟的延迟...
推荐答案
您可以做的最好的事情就是开始轮询出现在服务器端的项目。例如,当您在循环中使用从saveAsync
获得的ID的子顺序EWS查询并等待成功时,您可能会尝试一个难看的解决方案。
例如,我注意到以下示例,开发人员如何尝试处理此类SCENARIOUS:
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);
}
}
有关详细信息,请参阅App for Outlook: EWS request failed with item Id returned by item.saveAsync on compose new message。
您也可以尝试使用简单的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>
如果项目是在Exchange上创建的,则请求应返回ChangeKey
。
这篇关于在Office.js中,我们如何使用Office.Conext.mailbox.item.saveAsync响应(克服ErrorItemNotFound)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,WP2