如何在加载后将媒体变量添加到数组时不改变它们.闭包
How to not mutate media variables when adding them to array after load. Closures?
我有一个图像链接和视频链接数组。我从JSON
馈送中获得它们并将它们一个接一个地添加到我的数组中。我想确保它们是完全加载的,所以我分别为图像和视频使用onload
和canplaythrough
事件侦听器。然而,当我记录我的数组的结果时,它看起来像视频从未添加,我想知道这是因为我正在等待canplaythrough
事件在for
循环中触发,这正在改变我的newMediaObject
的值(我组成的构造函数)。我在代码的前半部分使用了闭包来防止这种情况,其中图像正在加载,但我不确定如何在视频部分实现相同的方法。我需要开始闭包在这里是我的代码:
for(i = entries.length -1; i >=0 i -=1){
//Do I somehow start both closures here or do I make one in each part of the for loop (i.e. the video and image for loop)
if (entries[k].type == 'image') {
mediaObject.isVideo = false;
mediaObject.url = entries[k]['ssMetaData']['images']['standard_resolution']['url'];
var img = new Image();
img.onload = (function (entry) {
//Here I am using a closure to prevent accessing the mutable variable
return function () {
contentArrayNew.push(entry);
preLoadDone = true;
}
})(mediaObject);
img.onerror = function () {
console.log('error: bad image source');
};
img.src = mediaObject.url;
} else if (entries[k].type == 'video') {
var loadVideo = document.createElement('video'); //Temp video to preload without displaying
mediaObject.isVideo = true;
//I think the error comes here, when "canplaythrough" hasn't fired and so its properties are set to another item in the array's
mediaObject.url = entries[k]['ssMetaData']['videos']['standard_resolution']['url'];
loadVideo.addEventListener('canplaythrough', function () {
contentArrayNew.push(mediaObject);
preLoadDone = true;
imagesLoaded();
}
}
}, false);
loadVideo.src = mediaObject.url;
}
}
是的,当你创建一个将被异步执行的回调并访问一个循环变量时,你将需要一个闭包。canplaythrough
处理程序使用mediaObject
,因此它在那里也需要一个。
为简单起见,您可以将整个循环体包装在IEFE中以创建一个作用域,而不是包装每个回调。
相关文章:
- d3.根据数组内容改变各个节点的颜色
- 从中删除元素后,javascript 数组的长度不会改变
- Javascript排序的数组会改变窗口对象,但在遍历它时不会改变
- 保持数组的顺序,但改变索引的位置
- JavaScript数组随着DOM的改变而改变
- 在函数内改变JavaScript数组
- Ng-repeat与指令:如何销毁重复项目后,数组已经改变
- 为什么数组'的长度属性'的值改变,即使在javascript中设置为只读
- 我如何使一个按钮改变Javascript数组位置
- Knockout:在改变可观察数组后设置select的标题
- 在不改变整个状态的情况下改变state数组(REACT / REDUX)
- 为什么knockoutjs js不't更新视图,如果一些子数组被改变
- Javascript array. prototype.sort()无意中改变了数组
- 根据数组中对象的数量改变id (javascript/jquery)
- Javascript数组一起改变
- react.js在改变状态数组后不更新DOM
- 如何改变传递给函数的数组,而不需要在javascript中迭代它的项
- KnockoutJS:模板不会在可观察数组改变时更新(只在添加时更新,在删除时有效)
- 如何使用jQuery和图像数组改变#header的css属性
- 数据绑定-在Javascript中数组改变时更新有序列表