【发布时间】:2018-08-11 06:38:08
【问题描述】:
我正在尝试获取列表中每个对象的持续时间(以秒为单位),但我的结果遇到了一些问题。我认为这是因为我没有完全理解异步行为。
我从 n 个对象的数组 songs[] 开始我的函数。在我的函数结束时,目标是有一个数组songLengths,其中第一个值是songs[] 中第一个对象的持续时间,依此类推。
我试图在这个例子之后为我的函数建模:JavaScript closure inside loops – simple practical example。但是我得到每个songLengths[] 索引的未定义值。
$("#file").change(function(e) {
var songs = e.currentTarget.files;
var length = songs.length;
var songLengths = [];
function createfunc(i) {
return function() {
console.log("my val = " + i);
};
}
for (var i = 0; i < length; i++) {
var seconds = 0;
var filename = songs[i].name;
var objectURL = URL.createObjectURL(songs[i]);
var mySound = new Audio([objectURL]);
mySound.addEventListener(
"canplaythrough",
function(index) {
seconds = index.currentTarget.duration;
},
false,
);
songLengths[i] = createfunc(i);
}
});
【问题讨论】:
-
您是否在某处定义了
length?你能提供一个songs包含什么的例子吗?您从不保存长度,只保存歌曲索引。 -
hello @Xufox 感谢您的评论,songs[] 包含用户上传的音频文件列表。例如,当我上传 5 首歌曲并打印出歌曲 [] 时,这就是控制台中的样子:i.imgur.com/xPP2k1L.png 长度已定义(使用 var length = song.length;我将编辑帖子以包含它)和它正确获取上传的文件数。所以我可以正确地遍历列表并以秒为单位获取时间,但我认为我并没有完全异步地这样做,因为有时一首歌曲的持续时间是另一首歌曲的持续时间
标签: javascript audio metadata duration