我正在使用Gmail API制作应用。为了向线程发送回复,我需要从原始消息中获取Message-ID
和References
标头。然后这些标头将包含在回复消息中。因此,在发送回复之前,我要从Gmail API中获取这些标头。标题已成功获取,但是我的代码不等待其获取并发送答复。我如何等待提取呼叫完成。我曾经使用过promises,但是作为我刚开始使用angularJS时,我认为我没有正确实现它们。请指导我更正我的代码。谢谢。
public getReplyMessage(userId, messageId):Promise<any> {
var headersToReturn = {
'MessageID' : '',
'References' : '',
}
gapi.client.load('gmail', 'v1', () => {
var request = gapi.client.gmail.users.messages.get({
'userId': userId,
'id': messageId,
'format': 'metadata',
'metadataHeaders': [ 'Subject','References','Message-ID' ]
});
request.execute((message) => {
var headers = message.payload.headers;
$.each(headers, ( name , value ) => {
if(name == 'Message-ID'){
headersToReturn.MessageID = value;
}
else if(name == 'References'){
headersToReturn.References = value;
}
});
});
});
return Promise.resolve(headersToReturn);
}
这是调用该函数的代码。
this.gmailApiService.getReplyMessage('me', this.MsgId).then((msgHeadersForReply) => {
this.MessageIDHeader = msgHeadersForReply.MessageID;
this.ReferencesHeader = msgHeadersForReply.References;
});
console.log("MsgIDHeader => "+this.MessageIDHeader); // this logs empty string.
任何帮助将不胜感激。谢谢:)
答案 0 :(得分:3)
您正在使用Promise,因此这里不需要Observables。
据我所知,您的console.log()
位于Promise之外,因此确实为NULL。
this.gmailApiService.getReplyMessage('me', this.MsgId).then((msgHeadersForReply) => {
this.MessageIDHeader = msgHeadersForReply.MessageID;
this.ReferencesHeader = msgHeadersForReply.References;
console.log("MsgIDHeader => "+this.MessageIDHeader); // <-- move it inside
});
您只需要在promise中移动日志,因此只有当解析的结果返回时,您才真正拥有结果,然后可以在其中访问其值。
另外,如果您需要处理更多代码并希望以这种方式进行结构化,则可以继续链接then()
,以便每个级别都等待上一个。
getReplyMessage()
.then(results => ... )
.then(() => console.log())
以此类推。
发表评论后,您的问题出在Promise中,而不是回报中。试试这个:
public getReplyMessage(userId, messageId) {
return new Promise((resolve, reject) => {
var headersToReturn = {
'MessageID': '',
'References': '',
}
gapi.client.load('gmail', 'v1', () => {
var request = gapi.client.gmail.users.messages.get({
'userId': userId,
'id': messageId,
'format': 'metadata',
'metadataHeaders': ['Subject', 'References', 'Message-ID']
});
request.execute((message) => {
var headers = message.payload.headers;
$.each(headers, (name, value) => {
if (name == 'Message-ID') {
headersToReturn.MessageID = value;
} else if (name == 'References') {
headersToReturn.References = value;
}
});
resolve(headersToReturn)
});
});
});
}