2 回答

TA贡献1775条经验 获得超11个赞
问题是它return duration是在onloadedmetadata回调执行之前执行的。该事件是异步的。其他问答中对此进行了更详细的解释,例如
在您的情况下,不要从回调函数中获取值,而是setState在该值可用时/在该值可用时调用:在onloadedmetadata事件处理程序中:
onChangeAudioFile(e) {
var objectURL = URL.createObjectURL(e.target.files[0]);
var audio = new Audio([objectURL]);
audio.onloadedmetadata = () => {
this.setState({
selectedFileDuration: audio.duration;
};
};
}

TA贡献1946条经验 获得超4个赞
该duration值不容易获得,您需要创建一个承诺,以便您可以await获取getDuration.
async onChangeAudioFile(e) {
this.setState({
selectedFileDuration: await getDuration(e.target.files[0])
};
function getDuration(file) {
return new Promise((res) => {
var objectURL = URL.createObjectURL(file);
var audio = new Audio([objectURL]);
audio.onloadedmetadata = function() {
console.log(audio.duration);
res(audio.duration)
}
})
}
}
添加回答
举报