代码之家  ›  专栏  ›  技术社区  ›  Asad ullah

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

  •  1
  • Asad ullah  · 技术社区  · 6 年前

    我正在用Gmail API制作一个应用程序。为了给线程发送回复,我需要 Message-ID References 来自原始邮件的邮件头。然后这些邮件头将包含在回复邮件中。所以在发送回复之前,我将从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);
    }
    

    下面是调用该函数的代码。

    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 回复  |  直到 6 年前
        1
  •  3
  •   Dark Falcon    6 年前

    你是带着承诺工作的,所以这里不需要观察。
    据我所见 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 
        });
    

    您只需将日志移动到promise中,所以只有当解析的结果返回时,您才实际拥有结果,并且可以在那里访问其值。

    另外,如果您有更多的代码要处理,并且希望以这种方式构造它,那么可以继续链接 then() 所以每一层,都要等上一层。

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