我正在填充一个清单数组,供preloadjs的LoadQueue类使用。在清单中,我引用了音频和图像文件的源,同时为每个文件创建唯一的ID。这一切都很好。
但是,由于从CMS数据库(Wordpress自定义帖子类型)中选择音频/图像文件,可能会出现多次选择相同音频的情况。换句话说,相同的音频文件可能不止一次出现在清单中。发生这种情况时,会发生一个非常奇怪的错误,即生成的LoadQueue实例中的最后一个IMAGE引用返回“undefined”。重复音频在清单数组中的位置无关紧要,它始终是LoadQueue实例中返回undefined的最后一个IMAGE对象。
重复的图像文件不会导致问题。
这是preloadjs中的错误吗? (是的,加载同一音频文件的多个副本当然是浪费,但在我的用例中,我们讨论的是小文件和有限数量的帖子)
var manifest = [];
for (var i = 0; i < game_pieces_data.length; i++) {
manifest.push({id: "sound" + i, src: game_pieces_data[i].audio_url});
manifest.push({id: "image" + i, src: game_pieces_data[i].image_url});
}
preload = new createjs.LoadQueue();
preload.installPlugin(createjs.Sound);
preload.on("complete", handlePreloadComplete, this);
preload.loadManifest(manifest);
function handlePreloadComplete() {
var bitmap;
for (var i = 0; i < game_pieces_data.length; i++) {
bitmap = new createjs.Bitmap(preload.getResult('image' + i));
// bitmap.image.width <- will return undefined for last item of
// the loop if one of the audio files is a duplicate?
...
}
}
编辑:我已经确定LoadQueue的“完成”事件在最终“fileLoad”事件触发之前触发(最后一个图像)。这是在我的处理程序中要求“完成”事件时最终图像未定义的原因。同样,只有在存在重复的音频文件时才会发生这种情况。
EDIT2:为了进一步缩小问题范围,我创建了一个清单,它只加载音频文件并跟踪“fileload”和“complete”事件。对于每个额外的重复音频文件,为该文件触发的“文件加载”事件的数量增加1(2个重复=文件加载为该文件触发3次,3个重复=文件加载为该文件触发4个等等)。此外,还会在LoadQueue实例文件数组中添加一个额外的副本(由getResult访问)。
但是,“完成”事件将在达到清单长度后触发,因此在完成事件之后将触发其他文件加载事件。当您拥有包含混合文件的清单时,会产生这种危害。在我的情况下,我的图像文件被正在制作的额外重复音频文件推送到队列的末尾。并且由于“完成”在清单长度的末尾正确触发,它会在任何图像文件被推送到队列末尾之前触发,从而导致代码在队列完成后期望这些文件存在的错误。 / p>
我正在通过创建2个LoadQueue实例来解决这个问题,一个用于音频,一个用于图像。当音频队列“完成”触发时,我创建一个图像并从单独的清单中加载它们。但这并不是一个想法,因为现在看来内存中存在多个无用的重复音频文件副本。此数字随着CMS中可能选择的每个附加副本呈指数级增长。