如何在加载后将媒体变量添加到数组时不改变它们.闭包

How to not mutate media variables when adding them to array after load. Closures?

本文关键字:数组 改变 闭包 添加 加载 变量 媒体      更新时间:2023-09-26

我有一个图像链接和视频链接数组。我从JSON馈送中获得它们并将它们一个接一个地添加到我的数组中。我想确保它们是完全加载的,所以我分别为图像和视频使用onloadcanplaythrough事件侦听器。然而,当我记录我的数组的结果时,它看起来像视频从未添加,我想知道这是因为我正在等待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中以创建一个作用域,而不是包装每个回调。