javascript - 回调返回未定义

标签 javascript jquery asynchronous callback gmail-api

我正在尝试从 GMail API 获取数据,以便能够从那里加载 base64 加密的附件数据,但当我尝试返回它时,我得到了未定义的信息。

$Message['Content']['Attachment'][$Count]['Data'] = getAttachments($Message['Details']['ID'], message['payload']['parts'][key], function (filename, mimeType, attachment) {
    return 'data:'+mimeType+';base64,'+attachment.data.replace(/-/g, '+').replace(/_/g, '/');
});


function getAttachments(messageID, parts, callback) {
     var attachId = parts.body.attachmentId;
     var request = gapi.client.gmail.users.messages.attachments.get({
          'id': attachId,
          'messageId': messageID,
          'userId': 'me'
     });
     request.execute(function (attachment) {
           callback(parts.filename, parts.mimeType, attachment);
     });
}

问题似乎是在函数返回值后数据才可用。这已经通过console.log()进行了测试。

最佳答案

这不是返回未定义的回调 - 它是 getAttachments()

对 GMail API 的调用是异步的,因此您不能以这种方式分配给 $Message...['Data'] - 您实际上是在分配 getAttachments( ) 不会返回任何内容,因此是 undefined

在进入实际回调之前,您不会获得可用数据,因此您需要在回调本身中设置值:

getAttachments($Message['Details']['ID'], message['payload']['parts'][key], function (filename, mimeType, attachment) {
    var data = 'data:'+mimeType+';base64,'+attachment.data.replace(/-/g, '+').replace(/_/g, '/');

    // now you have the data, you can set the property
    $Message['Content']['Attachment'][$Count]['Data'] = data;
});

您可能还需要将 $Message 的其他处理移到此处,例如发送它。

关于javascript - 回调返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38394107/

相关文章:

javascript - jQuery if 语句字符计数

jquery - 我如何修改这个 jQuery XML 解析器?

javascript - 如何从异步回调函数中更新全局变量?

javascript - 在鼠标指针下使用 JS 或 CSS 更改图像不透明度?

javascript - JSON - 我需要 "false"的属性吗?

Javascript回调函数问题

javascript - PostgreSQL 数据库 - 如何按顺序查询表(无限滚动)

jquery - float 条形图 : configure extent of x-axis when there's only one entry?

c# - "await"方法在其他 "async"方法中可以吗

javascript - 为什么我的 jQuery when().then() 函数会在 ajax 请求完成之前触发?