You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:10:36