1

我正在填充一个清单数组以供 preloadjs 的 LoadQueue 类使用。在清单中,我引用了音频和图像文件的源,同时为每个文件创建了唯一的 ID。这一切都很好。

但是,由于音频/图像文件是从 CMS 数据库(Wordpress 自定义帖子类型)中选择的,因此可能会多次选择相同的音频。换句话说,同一个音频文件可能不止一次地出现在清单中。发生这种情况时,会出现一个非常奇怪的错误,即生成的 LoadQueue 实例中的最后一个 IMAGE 引用返回“未定义”。清单数组中出现重复音频的位置无关紧要,它始终是 LoadQueue 实例中返回未定义的最后一个 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”事件的清单。对于每个额外的重复音频文件,为该文件触发的“fileload”事件数增加 1(2 dups = fileload 为该文件触发 3 次,3 dups = fileload 为该文件触发 4 次......等等)。此外,一个额外的副本被添加到文件的 LoadQueue 实例数组中(由 getResult 访问)。

但是,“完成”事件将在达到清单长度后触发,因此在完成事件之后会触发额外的文件加载事件。当您有一个包含混合文件的清单时,就会出现这种情况。就我而言,我的图像文件被制作的额外重复音频文件推到队列的末尾。并且由于“完成”在清单长度的末尾正确触发,它会在任何被推送到队列末尾的图像文件加载之前触发,从而导致代码中的错误,期望这些文件在队列完成后存在。

我正在通过创建 2 个 LoadQueue 实例来解决这个问题,一个用于音频,一个用于图像。当音频队列“完成”触发时,我创建一个图像并从单独的清单加载这些图像。然而,这不是想法,因为现在内存中似乎有多个无用的重复音频文件的副本。并且随着在 CMS 中可能选择的每个附加副本,这个数字会呈指数增长。

4

0 回答 0