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)
}
})
}
}
添加回答
舉報