【问题标题】:How can I recovery from the error 9030 while mailbox.item.body.getAsync failed?当mailbox.item.body.getAsync 失败时,如何从错误9030 中恢复?
【发布时间】:2019-05-07 18:41:46
【问题描述】:

我正在开发 Outlook 插件。但我得到的问题是有时 Office.context.mailbox.item.body.getAsync 在加载项页面重新加载时会失败。最糟糕的是,一旦 body.getAsync 返回错误“APICallFailedDueToItemChange”,body.getAsync 将始终失败并出现相同的错误。 此错误的详细信息是 {name: "APICallFailedDueToItemChange", message: "The selected item has been changed.", code: 9030}

我尝试调用 getAsync 甚至重新加载整个窗口以使加载项重新启动,但错误将持续发生。唯一的方法是切换到另一封电子邮件。

重现步骤: 1.创建任何尝试获取电子邮件正文的Outlook添加 2.加载项后,重新加载加载项窗口 3.一旦发生9030错误,控制台中的那些代码总是会触发相同的错误,直到我切换到另一封电子邮件

await new Promise((resolve, reject) => {
    window.Office.context.mailbox.item.body.getAsync('text', (result) => {
      if (result.status === 'succeeded') {
        console.log(result.value)
        return resolve(result.value); // updated as suggested by Mavi Domates
      } else {
        console.error(result.error)
        return reject(result.error);
      }
    })
  })

我希望即使之前的回调失败,getAsync 也应该可以正常工作,但实际上永远不会清除异常。

【问题讨论】:

  • 你在哪个客户端测试这个? Windows Win32 桌面? Outlook Web 访问?等等还有什么具体的版本?
  • 另外你是如何重新加载加载项窗口的?
  • 如果您使用 SupportsPinning 功能。您还需要为 itemChanged 事件实现 addHandlerAsync。否则,在项目上调用 API 将导致该错误。
  • @OutlookAdd-insTeam-MSFT 我的客户端是 MacOS 10.14.4 Outlook 16.24。为了重现此窗口,我通过右键单击加载项并选择“重新加载”来重新加载页面。它随机发生,但尝试了大约 10 次。我还添加了 itemChanged 事件,为什么切换到另一封电子邮件可以恢复此问题。
  • @OutlookAdd-insTeam-MSFT 我在github 中创建了一个测试项目。你能帮忙看看吗?谢谢 这个问题与我想固定该任务窗格有关。在我更改清单之前,我尝试重新加载窗口大约 20 多次,没有问题。使用 addHandlerAsync 相关逻辑后,如果我固定任务窗格并切换电子邮件,然后通过右键单击重新加载。错误重现。

标签: office-js outlook-web-addins outlook-for-mac


【解决方案1】:

请这样修改你的代码,你并没有对这个承诺做任何事情。

await new Promise((resolve, reject) => {
    return window.Office.context.mailbox.item.body.getAsync('text', (result) => {
      if (result.status === 'succeeded') {
        console.log(result.value);
        return resolve(result.value);
      } else {
        console.error(result.error);
        return reject(result.error);
      }
    })
  })

【讨论】:

  • 感谢您的回复。是的,在我真正的项目代码中,我解决并拒绝了它。我在此处粘贴的代码用于在控制台中进行测试。不知何故,你的建议是有道理的
  • 请尝试一下
【解决方案2】:

我也有同样的问题。

我正在开发一个 Outlook 插件,我需要获取我阅读的每封电子邮件的电子邮件正文。

在 Windows(OWA 和应用程序)中一切正常。它也适用于 Safari Mac OWA,但不适用于 Mac 版 Outlook 应用程序。

item.body.getAsync 第一次工作,但是当插件被固定并且我切换到另一个邮件时,它返回一个 9030 错误。我处理 ItemChangedEvent。当项目更改时,我还尝试使用 window.reload() 完全重新加载加载项,但同样的问题。我所有的包都是最新的。

我在 Github 和 Stackoverflow 上看到了一些帖子,但似乎问题仍未解决。有没有替代的解决方案?

这是我获取正文的代码(当我切换到另一封邮件时,值为 null):

item.body.getAsync("text", (result) => {
    const { value } = result;

    getParsedContact({
      variables: {
        email: contactToParse.email,
        name: contactToParse.displayName,
        body: contactToParse.main
          ? (value || "").replace(/(\r\n|\n|\r)/gm, "\n")
          : "",
      },
    });
  });

另外,我的 addHandlerAsync :

const reloadInterface = () => {
  if (Office.context.mailbox.item != null) {
    console.log("New item detected. Reloading interface...");
    location.reload(true); // I try here to reload all the add-in when switching to another email
  } else {
    console.log("No email is selected.");
    Office.context.mailbox.removeHandlerAsync(
      Office.EventType.ItemChanged,
      function() {
        console.log("Item Change event unregistered.");
        Office.context.mailbox.addHandlerAsync(
          Office.EventType.ItemChanged,
          reloadInterface
        );
        console.log("Item Change event re-registered.");
      }
    );
  }
};

Office.initialize = () => {
  isOfficeInitialized = true;

  Office.context.mailbox.addHandlerAsync(
    Office.EventType.ItemChanged,
    reloadInterface
  );

  render(App);
};

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多