在Outlook JS加载项中调用REST API的同时确认事件完成

问题描述

我正在构建一个JS加载项,只需单击功能区中的一个按钮,即可将带有添加的注释“ STOP”的消息转发到定义的地址。为了转发,我通过POST请求调用REST API。

函数末尾添加event.completed()并以(event)作为参数时,getCallbackTokenAsync根本不运行。

相反,没有它,外接程序会正确转发消息,但信息栏不会消失,脚本会继续循环运行:

信息栏以指示脚本正在运行:https://i.stack.imgur.com/zGa2K.png

关于调用REST API时如何正确处理event.completed()的任何想法?

// the function sendAsstops is called directly from the manifest file
function sendAsstops(event) {
  console.log("Initialising STOP command.");
  var restHost = Office.context.mailBox.restUrl;
  var itemId = getItemRestId();
  console.log(itemId);
  Office.context.mailBox.getCallbackTokenAsync({ isRest: true },function (result) {
    if (result.status === Office.AsyncResultStatus.Succeeded) {
      console.log('Sending email...');
     var accesstoken = result.value;
      console.log(result);
      var getMessageUrl = restHost + '/v2.0/me/messages/' + itemId + '/forward';
        $.ajax({
          url: getMessageUrl,type: 'post',headers: { 'Authorization': 'Bearer ' + accesstoken },contentType: 'application/json',dataType: 'json',data: JSON.stringify({
            'Comment': 'STOP','ToRecipients': [{'EmailAddress': { 'Address': '[email protected]' }}],})
         }).done(function() {
           console.log("Stop successfully forwarded.");
         }).fail(function(error) {
           console.log("Failed to send");
        });
    } else {
      console.log("Unable to proceed. Ref: " + result.status);
      return false;
    }
  });
  event.completed();
}

function getItemRestId() {
  console.log("Getting item ID...");
  if (Office.context.mailBox.diagnostics.hostName === 'OutlookIOS') {
    console.log("ID ready to use.");
    return Office.context.mailBox.item.itemId;
  } else {
    console.log('Converting ID...');
    return Office.context.mailBox.convertToRestId(
      Office.context.mailBox.item.itemId,Office.MailBoxEnums.RestVersion.v2_0
    );
  }
}

解决方法

event.completed()必须在外接程序执行结束时调用。调用event.completed()将终止您的加载项,因此所有异步调用(在这种情况下,例如getCallbackTokenAsync回调)都将自动终止并清除。因此,您看不到该加载项转发邮件。

整个加载项执行完毕后,致电event.completed()。像这样:

       $.ajax({
          url: getMessageUrl,type: 'post',headers: { 'Authorization': 'Bearer ' + accessToken },contentType: 'application/json',dataType: 'json',data: JSON.stringify({
            'Comment': 'STOP','ToRecipients': [{'EmailAddress': { 'Address': '[email protected]' }}],})
         }).done(function() {
           console.log("Stop successfully forwarded.");
           event.completed();
         }).fail(function(error) {
           console.log("Failed to send");
           event.completed();
        });