使用TypeScript开发Outlook Add-In获取邮件正文遇异步问题求助
问题解决:Outlook Add-In 获取邮件正文异步问题
你的核心问题是getAsync是基于回调的异步操作,即便用了async函数,也没有等待这个回调执行完成就继续走后续代码,而且原代码里的条件判断写反了。
错误点分析
- 条件逻辑错误:原代码里
asyncResult.status !== Succeeded时才赋值,这和实际需求相反,应该是成功状态时才获取正文。 - 未等待异步回调:
getEmailDataToSend.description的赋值在回调里,但函数没等回调执行就结束了,导致后续代码执行时正文还没被赋值。
修正方案:将回调转为Promise并用await等待
把getAsync包装成Promise,这样就能用await等待异步操作完成,确保拿到正文后再处理后续逻辑:
const getBodyDescription = async () => { const emailBody = await item.body; // 用Promise包裹getAsync,将回调式异步转为可await的异步 const bodyHtml = await new Promise<string>((resolve, reject) => { emailBody.getAsync(Office.CoercionType.Html, (asyncResult) => { if (asyncResult.status === Office.AsyncResultStatus.Succeeded) { resolve(asyncResult.value); } else { reject(new Error(`获取邮件正文失败: ${asyncResult.error.message}`)); } }); }); getEmailDataToSend.description = bodyHtml; console.log("body hit"); console.log("passed method"); };
可选:添加错误捕获
如果需要处理获取失败的情况,可以用try/catch包裹逻辑:
const getBodyDescription = async () => { try { const emailBody = await item.body; const bodyHtml = await new Promise<string>((resolve, reject) => { emailBody.getAsync(Office.CoercionType.Html, (asyncResult) => { if (asyncResult.status === Office.AsyncResultStatus.Succeeded) { resolve(asyncResult.value); } else { reject(new Error(`获取邮件正文失败: ${asyncResult.error.message}`)); } }); }); getEmailDataToSend.description = bodyHtml; console.log("body hit"); } catch (error) { console.log("body fail", error); } console.log("passed method"); };
内容的提问来源于stack exchange,提问作者MrBlaze
相关产品推荐
相关产品推荐

