2 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
問(wèn)題是它return duration是在onloadedmetadata回調(diào)執(zhí)行之前執(zhí)行的。該事件是異步的。其他問(wèn)答中對(duì)此進(jìn)行了更詳細(xì)的解釋?zhuān)?/p>
在您的情況下,不要從回調(diào)函數(shù)中獲取值,而是setState在該值可用時(shí)/在該值可用時(shí)調(diào)用:在onloadedmetadata事件處理程序中:
onChangeAudioFile(e) {
? var objectURL = URL.createObjectURL(e.target.files[0]);
? var audio = new Audio([objectURL]);
? audio.onloadedmetadata = () => {
? ? this.setState({
? ? ? selectedFileDuration: audio.duration;
? ? };
? };
}

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊
該duration值不容易獲得,您需要?jiǎng)?chuàng)建一個(gè)承諾,以便您可以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)
}
})
}
}
添加回答
舉報(bào)