Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在angular&;中等待API调用完成;打字稿_Angular_Typescript - Fatal编程技术网

如何在angular&;中等待API调用完成;打字稿

如何在angular&;中等待API调用完成;打字稿,angular,typescript,Angular,Typescript,我正在使用Gmail API制作一个应用程序。为了向线程发送回复,我需要从原始消息中获取消息ID和引用标题。然后这些标题将包含在回复消息中。所以在发送回复之前,我将从Gmail API获取这些头文件。正在成功获取标题,但我的代码不会等待获取标题并发送回复。如何等待回迁呼叫完成。我使用过承诺,但由于我是angularJS的初学者,我认为我没有正确地实现它们。请引导我更正代码。谢谢 public getReplyMessage(userId, messageId):Promise<any>

我正在使用Gmail API制作一个应用程序。为了向线程发送回复,我需要从原始消息中获取
消息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 in
request.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)
        });
    });
 });
}