如何使用forge.file.cacheURL正确缓存许多图像(循环)?

时间:2012-06-20 14:20:01

标签: trigger.io forge

我有一个从服务器下载为json文件的产品列表。每个项目都包含指向存储在服务器上的图像的链接。

现在我希望能够在离线时看到产品,因此我将下载的json文件存储到forge.prefs http://docs.trigger.io/en/v1.3/modules/prefs.html并将其拉出以在屏幕上显示项目。它工作得很好,但我还需要存储图像,以便正确显示。

要实现这一点,我正在尝试使用forge.file.cacheURL http://docs.trigger.io/en/v1.3/features/cache.html,但无法处理正确的操作顺序。要缓存图像,我运行json文件,对于每行,我调用forge.file.cacheURL并将url存储回JSON项。但问题是forge.file.cacheURL异步运行所以我的循环遍历项目并收集本地图像完成,我的代码继续显示图像(查看项目)但同时forge.file.cacheURL仍然收集并缓存图像因为它的异步操作。我需要以某种方式检测最后一个项目是否被缓存,然后刷新屏幕上的视图以使用正确的图像URL ...或其他会导致我需要的东西。

希望你理解这个概念。我应该如何妥善处理?

1 个答案:

答案 0 :(得分:0)

从v1.4.26开始,你已经能够永久存储图像(参见http://docs.trigger.io/en/v1.4/release-notes.html#v1-4-26),而不仅仅是缓存它们。根据您的需求,这可能是比forge.file.cacheURLforge.file.isFile更好的选择。

我并不完全按照你描述的情况,但这样的事情会让你等待几件异步事情完成之后才能完成:

// e.g.
var jsonCache = {
    one: "http://example.com/one.jpg",
    two: "http://example.com/two.jpg",
    three: "http://example.com/three.jpg"
};

var cacheCount = 0;
for (var name in jsonCache) {
    if (jsonCache.hasOwnProperty(name)) {
        var imageURL = jsonCache[name];
        cacheCount += 1;
        forge.file.cacheURL(imageURL, function (file) {
            forge.prefs.set(name, file, function () {
                cacheCount -= 1; // race condition, but should be fine (!)
                if (cacheCount <= 0) {
                    alert('all cached');
                }
            });
        });
    }
}