如何在角度和打字稿中等待API调用完成

时间:2018-08-10 13:26:24

标签: angular typescript

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

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

1 个答案:

答案 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)
        });
    });
 });
}