Javascript 返回未定义的回调

Javascript 返回未定义的回调,javascript,jquery,asynchronous,callback,gmail-api,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 'da

我试图从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()
的结果,该结果不返回任何内容,因此
未定义

只有在实际回调中,数据才可用,因此需要在回调本身中设置值:

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;
});
您可能还需要将
$消息的其他处理移动到此处,例如发送。

getAttachments()
函数未返回任何值,这就是它未定义的原因

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