回调返回undefined

我试图从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()进行了测试。

它不是返回undefined的回调 – 它是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其他处理移动到此处,例如发送它。

getAttachments()函数没有返回任何值,这就是为什么它undefined

解:

 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, '/'); });