问题描述
我正在构建一个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();
});