如何在angular&;中等待API调用完成;打字稿
我正在使用Gmail API制作一个应用程序。为了向线程发送回复,我需要从原始消息中获取如何在angular&;中等待API调用完成;打字稿,angular,typescript,Angular,Typescript,我正在使用Gmail API制作一个应用程序。为了向线程发送回复,我需要从原始消息中获取消息ID和引用标题。然后这些标题将包含在回复消息中。所以在发送回复之前,我将从Gmail API获取这些头文件。正在成功获取标题,但我的代码不会等待获取标题并发送回复。如何等待回迁呼叫完成。我使用过承诺,但由于我是angularJS的初学者,我认为我没有正确地实现它们。请引导我更正代码。谢谢 public getReplyMessage(userId, messageId):Promise<any>
消息ID
和引用
标题。然后这些标题将包含在回复消息中。所以在发送回复之前,我将从Gmail API获取这些头文件。正在成功获取标题,但我的代码不会等待获取标题并发送回复。如何等待回迁呼叫完成。我使用过承诺,但由于我是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);
}
我们将非常感谢您的帮助。谢谢:)您正在与Promise合作,因此无需在此处进行观察。
从我看到的情况来看,您的
console.log()
超出了承诺范围,因此它实际上是空的
this.gmailApiService.getReplyMessage('me', this.MsgId).then((msgHeadersForReply) => {
this.MessageIDHeader = msgHeadersForReply.MessageID;
this.ReferencesHeader = msgHeadersForReply.References;
console.log("MsgIDHeader => "+this.MessageIDHeader); // <-- move it inside
});
等等
在你评论之后,你的问题在于承诺,而不是回报。试试这个:
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)
});
});
});
}
你说的是打字脚本。您是否使用Angular版本2或更高版本?“AngularJS”的名称实际上是为Angular的第一个版本保留的,据我所知,AngularJS没有使用Typescript。如果这是一个错误,请相应地编辑并重新标记您的问题,这将有助于更好地接收。编辑并重新标记。谢谢你的建议。你用Observable.zip试试吗?@wrivas正如我提到的,我是angular的初学者,所以对它了解不多。你能用Observable编辑我的代码吗?如果可能的话。@Asadullah尝试编辑。我不熟悉这个gapi及其返回的内容,但我试图确保它只有在新数据更新后才能解析。@dAxx\ux:the
resolve
需要在最里面的回调中。您在更远处有一个回调,这意味着它将在请求之前被调用。执行
完成。@DarkFalcon捕捉得好,括号太多了,嘿,我会将它转换为async/wait,但我现在不想进入其中。@dAxx_u也尝试了您的编辑。但仍然返回空字符串。如果I console.log inrequest.execute
则正确显示数据。你认为我说的对吗?如果你尝试我的编辑(在编辑Falcon之后),它应该可以工作,特别是当你在同一个地方登录时,它可以工作。添加一个catch来捕获任何错误,可能中间出现了故障,并检查结果。
getReplyMessage()
.then(results => ... )
.then(() => console.log())
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)
});
});
});
}