使用FileReader读取音频文件为何返回[object promise]而非Data URL?
问题原因及解决方法
首先明确:FileReader的readAsDataURL是异步操作,它不会立刻返回Data URL,而是在文件读取完成后通过onload事件回调返回结果。你的代码完全搞错了它的使用逻辑,这才导致最终拿到[object promise]这类错误结果。
你的代码里的具体问题
- 变量逻辑混乱:你把
audioReader_SE赋值成getAudioURL()的返回值,但readAsDataURL本身是无返回值的方法,所以audioReader_SE根本不是一个合法的FileReader实例,后续读取audioReader.result自然拿不到正确结果。 - 同步获取异步结果:你直接调用
getAudioURLResult()去读取result,但此时FileReader还没完成文件读取操作,result值为空,甚至变量都没正确关联到FileReader实例。 - 至于图片处理看似正常,大概率是之前的代码无意中遵循了异步逻辑(比如在
onload回调里处理结果),但你当前的音频代码完全没按异步流程来写。
正确的写法示例
方式1:直接使用onload事件回调
// 假设你已经获取到选中的audioFileStorage文件对象 const audioReader_SE = new FileReader(); // 监听读取完成事件 audioReader_SE.onload = function() { // 读取完成后,this.result才是正确的音频Data URL const audioSrcStorage = this.result; console.log(audioSrcStorage); // 在这里执行写入文本文件的逻辑,而不是同步去获取结果 }; // 启动异步读取操作 audioReader_SE.readAsDataURL(audioFileStorage);
方式2:用Promise封装,配合async/await使用
// 封装FileReader为Promise function getAudioDataUrl(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result); reader.onerror = reject; reader.readAsDataURL(file); }); } // 在async函数中调用 async function processAudio() { // 假设这里已经获取到audioFileStorage文件对象 const audioSrcStorage = await getAudioDataUrl(audioFileStorage); console.log(audioSrcStorage); // 在此执行写入文本文件的操作 }
内容的提问来源于stack exchange,提问作者german andino
相关产品推荐
相关产品推荐

