angular - 如何在角度和打字稿中等待 API 调用完成
问题描述
我正在使用 Gmail API 制作应用程序。为了向线程发送回复,我需要从原始消息中获取Message-ID
和References
标题。然后这些标头将包含在回复消息中。所以在发送回复之前,我会从 Gmail API 中获取这些标头。标头已成功获取,但我的代码不会等待它们被获取并发送回复。我怎样才能等待获取调用完成。我使用了 Promise,但由于我是 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 中,而不是在 return 中。尝试这个:
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)
});
});
});
}
推荐阅读
- javascript - 如何使用 JavaScript/reactjs 检测 android 后点击?
- javascript - vue.js 组件在对另一个组件执行 vuex 操作后未更新
- python - 如何使用 pscp 将在 python 脚本中创建的文件复制到需要密码的远程服务器?
- c# - 无法从模型中引用 asp:HIddenField
- python - 如何比较 python/pandas 中 2 个 csv 文件(csv1 和 csv2)列中的所有条目?
- ag-grid - ag-grid angular上组标题的单击事件
- c# - 如何从文件夹中压缩文件但保持分开
- python - 无法更改 KMeansClustering Tensorflow 中的集群数量
- java - 为什么我不能在 Java.net 中使用任何端口?
- flutter - 列表视图构建器项的动态高度