首页 > 解决方案 > 如何在角度和打字稿中等待 API 调用完成

问题描述

我正在使用 Gmail API 制作应用程序。为了向线程发送回复,我需要从原始消息中获取Message-IDReferences标题。然后这些标头将包含在回复消息中。所以在发送回复之前,我会从 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.

任何帮助将不胜感激。谢谢 :)

标签: angulartypescript

解决方案


你正在使用 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)
        });
    });
 });
}

推荐阅读