[英]how to wait for API call to complete in angular & typescript
我正在使用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.
任何帮助将受到高度赞赏。 谢谢 :)
你正在使用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)
});
});
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.