customXmlParts() null asyncResult.id

问题描述

我将以下代码作为 Word 加载项的 javascript 的一部分:

function createCustomXmlPartAndStoreID() {
  const xmlString = "<Reviewers xmlns='http://schemas.contoso.com/review/1.0'><Reviewer>Mark</Reviewer><Reviewer>Hong</Reviewer><Reviewer>Sally</Reviewer></Reviewers>";
  Office.context.document.customXmlParts.addAsync(xmlString,(asyncResult) => {
          Office.context.document.settings.set('ReviewersID',asyncResult.id);
          console.log('SET: ' + asyncResult.id);
          Office.context.document.settings.saveAsync(function (asyncResult) {
            if (asyncResult.status == Office.AsyncResultStatus.Failed) {
                console.log('Settings save Failed. Error: ' + asyncResult.error.message);
            } else {
                console.log('Settings saved.');
            }
          });
      }
  );
  getReviewers();
}
function getReviewers() {
  const reviewersXmlId = Office.context.document.settings.get('ReviewersID');
  console.log('GOT: ' + reviewersXmlId);
  Office.context.document.customXmlParts.getByIdAsync(reviewersXmlId,(asyncResult) => {
          asyncResult.value.getXmlAsync(
              (asyncResult) => {
                  $("#xml-blob").text(asyncResult.value);
              }
          );
      }
  );

它是由 Link

拼凑而成的

在 Word 中运行加载项,在控制台中我收到以下消息:
得到:空
错误函数 getByIdAsync 的参数无效。
设置:未定义
设置已保存。

因此,保存了 XML 设置(我可以在文档中看到它们)– itemXX.xml 具有:

<Reviewers xmlns="http://schemas.contoso.com/review/1.0"><Reviewer>Mark</Reviewer><Reviewer>Hong</Reviewer><Reviewer>Sally</Reviewer></Reviewers>

然而,我期望的有效 ReviewersID 实际上是未定义的,当它被设置时,然后当我尝试检索它时为 null,结果 getByIdAsync() 抛出错误

知道我做错了什么吗?

编辑:我正在接近解决方案,但仍然存在一些问题:

function addXMLPartandHandler() {
  Office.context.document.customXmlParts.addAsync(
      "<testns:book xmlns:testns='http://testns.com'><testns:page number='1'>Hello</testns:page><testns:page number='2'>world!</testns:page></testns:book>",function(r) {
          console.log('1 addAsyncID: ' + r.value.id); 
          Office.context.document.settings.set('WikindxID',r.value.id);
          r.value.addHandlerAsync(Office.EventType.DatanodeDeleted,function(a) {
            console.log(a.type); 
            console.log(a);
          },function(s) {
                console.log('2 ' + s.status);
              });
      });
      Office.context.document.settings.saveAsync();
      var wikindxXmlID = Office.context.document.settings.get('WikindxID');
      console.log('3 WikindxID: ' + wikindxXmlID);
      Office.context.document.bindings.getByIdAsync(wikindxXmlID,function (asyncResult) {
        console.log('4 ' + asyncResult.status);
      });
}

在控制台中,这会产生:

3 WikindxID: {4A32BF0A-A11D-7141-82DD-F4441E467099}
1 addAsyncID: {7F685839-E425-B145-9C32-ED0F3C58CD49}
4 Failed
2 succeeded

我希望 WikindxID 是来自 addSyncID 的值,但它总是落后于 1,这就是我收到失败消息的原因。问题是执行顺序,这里我对 javascript 逻辑的了解下降了 - 我不知道为什么我没有按 1、2、3、4 的顺序收到消息。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)