Этот контекст потерян и asyncResult.context не определен в обратных вызовах метода Office JS - PullRequest
0 голосов
/ 28 января 2020

Я упускаю что-то очевидное. Используя Office. js с TypeScript, при попытке выполнить метод, предоставленный параметру обратного вызова некоторых функций, таких как makeEwsRequestAsync(data, callback), любые локальные функции (или переменные, в этом отношении), вызываемые в этом callback(), возвращаются неопределенными, что приводит к "xyz Is not a function" ошибки.

Я предполагаю, что это связано с изменением this при выполнении в контексте функции makeEwsRequestAsync(data, callback). Как мне go передать эти функции или параметры явно, без this? Или я неверен в этом предположении, и что-то еще вызывает эту проблему?

 sendRequest() {
   Office.context.mailbox.makeEwsRequestAsync(
     this.getSubjectRequest(Office.context.mailbox.item.itemId), this.callback);
 }

 callback(asyncResult) {
   let result = asyncResult.value;

   //Result processing happens here

   // \/ This throws "PostFile is not a function"
   this.PostFile(base64String);
 }

 PostFile(base64String: string) {
   //POST happens here
 }

Я также попытался использовать необязательный параметр "userContext" makeEwsRequestAsync следующим образом:

outerThis: thisService

sendRequest(folderId: string) {
    this.folderId = folderId;

    Office.context.mailbox.makeEwsRequestAsync(
      this.getSubjectRequest(Office.context.mailbox.item.itemId), this.callback, this.outerThis);
  }

И затем извлекает контекст через asyncResult.context в обратном вызове, но контекст не заполняется, как ожидалось, и возвращает undefined. Фактически единственными свойствами в объекте «asyncResult» являются «значение» и «статус» вместо «значение» и «контекст».

Заранее благодарен за любую помощь

1 Ответ

0 голосов
/ 28 января 2020

Как мне go передать эти функции или параметры явно, без этого?

Это называется связыванием того, что вы ищете, вы можете заархивировать его двумя способами:

С помощью метода .bind ():

 sendRequest() {
   Office.context.mailbox.makeEwsRequestAsync(
     this.getSubjectRequest(Office.context.mailbox.item.itemId), this.callback.bind(this));
 }
callback() {/*...*/}

или с помощью функции со стрелкой (автоматическое связывание):

sendRequest() {
   Office.context.mailbox.makeEwsRequestAsync(
     this.getSubjectRequest(Office.context.mailbox.item.itemId), this.callback);
 }
callback = (asyncResult) => {
   let result = asyncResult.value;

   //Result processing happens here

   // \/ This throws "PostFile is not a function"
   this.PostFile(base64String);
 }

или очень старого способа выполнения это (не рекомендуется):

const that = this 

, а затем использовать that в обратном вызове вместо this.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...