Office.js中如何使用saveAsync返回值解决ErrorItemNotFound错误
重试策略实现方案
- 不要使用固定间隔的每秒重试,推荐采用带随机抖动的指数退避策略:首次重试间隔设为2秒,之后每次重试间隔翻倍(2s→4s→8s→16s→32s,单次最大间隔不超过30秒),每次间隔叠加0~1秒的随机抖动避免请求集中。结合你提到的大附件场景,总重试超时时间设为120秒即可覆盖绝大多数情况。
- 重试终止条件:当调用接口返回非
ErrorItemNotFound错误时终止(无论接口返回成功还是其他业务错误);如果达到120秒最大超时时间仍返回ErrorItemNotFound,直接给用户弹出明确提示,告知当前邮件尚未完成服务器同步,请手动触发操作或稍后再试。 - 重试时无需重复调用
saveAsync接口,直接用首次拿到的itemId调用轻量的查询类接口验证可用性即可,避免生成多余的草稿副本。
替代轮询的事件触发方案
- 可以先通过
Office.EventType.AttachmentsChanged事件监听附件上传状态,等所有用户添加的附件全部上传完成后再启动重试逻辑,可大幅减少无效重试次数。 - 若你的加载项使用的是Outlook JS API v1.13及以上版本,可以调用
Office.context.mailbox.item.getItemIdAsync接口替代直接从saveAsync结果取ID,该接口会自动等待项目同步完成后再返回可用的itemId,不需要自己实现重试逻辑。
额外优化建议
你实测保存后10秒拿不到ID属于缓存模式下带大附件的正常现象,如果你的业务流程允许,不要阻塞用户当前撰写操作,可以先把后续要执行的逻辑缓存到本地,后台静默重试,验证ID可用后自动执行后续操作,执行完成再给用户轻量提示即可。
内容的提问来源于stack exchange,提问作者user16457328
相关产品推荐
相关产品推荐

