我正在尝试使用
body.getAsync()
方法获取 Outlook 中电子邮件的正文内容:
let body = '';
body = Office.context.mailbox.item.body.getAsync(
"text",
function (result) {
if (result.status === Office.AsyncResultStatus.Succeeded) {
body = result.value;
}
}
);
console.log(body);
在这种情况下,
console.log(body)
返回未定义。但是,如果我尝试将结果记录在 getAsync
回调中:
if (result.status === Office.AsyncResultStatus.Succeeded) {
body = result.value;
console.log(body);
}
运行正常,邮件正文内容成功返回。
你必须记住,Javascript 从上到下同步运行,除非你使用回调、promise 或 async/await。本质上,
body
是未定义的,因为当调用Office.context.mailbox.item.body.getAsync()
时,console.log()
尚未完成。当 getAsync()
完成时,就会调用回调函数。另外, getAsync()
返回 void 而不是消息正文。您需要使用回调来访问正文。
你可以做的是:
let body = '';
Office.context.mailbox.item.body.getAsync(
"text",
function (result) {
if (result.status === Office.AsyncResultStatus.Succeeded) {
body = result.value;
doSomething(body)
}
}
)
function doSomething(body){
console.log(body);
}
使用对象来保留其值。
let bodyObject = {};
Office.context.mailbox.item.body.getAsync(
"text",
function (result) {
if (result.status === Office.AsyncResultStatus.Succeeded) {
bodyObject.body = result.value;
}
}
)
console.log(bodyObject.body);
出于测试目的,我发现 Goutam 的答案更简单。
请参阅底部的代码以了解我的脚本实验室插件片段测试。
但是,它不会在第一次从 Script Lab 加载项运行时将正文记录到控制台,但会在第二次按下“运行”按钮时将正文记录到控制台。
当我使用 juicy-g 的版本时,它会在按下第一个按钮时返回正文。
$("#run").on("click", run);
let bodyObject = {body: ""};
function run() {
Office.context.mailbox.item.body.getAsync(
"text",
function (result) {
if (result.status === Office.AsyncResultStatus.Succeeded) {
bodyObject.body = result.value;
}
}
);
console.log(bodyObject.body);
}
$("#run").on("click", run);
function run() {
Office.context.mailbox.item.body.getAsync(
"text",
function (bodyResult) {
// await sleep(1000);
if (bodyResult.status === Office.AsyncResultStatus.Succeeded) {
showBody(bodyResult.value);
}
});
}
function showBody(body) {
console.log(body);
}
这花费了我一些时间来学习,所以我希望这有助于为其他人节省时间。