繁体   English   中英

如何在angular&typescript中等待API调用完成

[英]how to wait for API call to complete in 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.

任何帮助将受到高度赞赏。 谢谢 :)

你正在使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM