2

我正在开发 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 也应该可以正常工作,但实际上永远不会清除异常。

4

2 回答 2

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);
      }
    })
  })
于 2019-05-09T13:57:01.600 回答
0

我有同样的问题。

我正在开发 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);
};
于 2020-06-16T09:59:44.543 回答