首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LocalForage,图像和气泡

LocalForage,图像和气泡
EN

Stack Overflow用户
提问于 2016-06-22 09:53:41
回答 1查看 3.5K关注 0票数 0

我对LocalForage的使用有点困惑。我只想从LocalForage保存和检索一个图像,下面是我所做的。

代码语言:javascript
复制
function preload() {

    localforage.setDriver(localforage.LOCALSTORAGE).then(function() {

        lcl_images[0] = new Object();
        lcl_images[0].key = 'lclstorage_1';
        lcl_images[0].value = 'http://www.superga.com/tcnimg/S/02/S009TE0/XBS009TE0___949______.jpg';

        lcl_images[1] = new Object();
        lcl_images[1].key = 'lclstorage_2';
        lcl_images[1].value = 'https://mir-s3-cdn-cf.behance.net/project_modules/max_1200/2150fb35419617.56f6327b44e47.gif';

        for (var i = lcl_images.length - 1; i >= 0; i--) {

            var valore = lcl_images[i].value;
            localforage.setItem(lcl_images[i].key, lcl_images[i].value, function() {
                console.log('Saved: ' + valore);
            });
        }
    });
}

function use_preloaded_image() {

    for (var i = lcl_images.length - 1; i >= 0; i--) {

        var key = lcl_images[i].key;
        localforage.getItem(lcl_images[i].key, function(err, readValue) {
            console.log('Read: ', readValue);
            document.getElementById(key).src = readValue;
        });
    }
}

关键是,我不知道使用图像是否是正确的方法:我将它们存储为字符串,localForage应该使用parsestringify这个示例运行得很好(当我脱机时,我刷新页面,本地存储中的图像是可用的),但是我看到有人在使用images或Blobs (我从来没有听说过这一点,现在的搜索还没有告诉我太多)。其他人则通过XHR请求下载映像,然后将其保存。

我可以考虑使用XHR请求来检查图像是否已经下载。是这样的吗?

第二:有人说用气泡储存更好。为什么?

请帮帮我,谢谢。

编辑(多个承诺)

当我检索图像时,我必须将每个图像绑定到一个<img>。但我不知道怎么做,用承诺。因为在使用Promise.all()时,我不能使用for循环(因此没有索引将图像src与图像id绑定)。

代码语言:javascript
复制
var promises = [];

for (var i = lcl_images.length - 1; i >= 0; i--) {
    promises.push(localforage.getItem(lcl_images[i].key));
}

Promise
    .all(promises)
    .then(function(value) {
        console.log(value);
    })
    .catch(function(error) {
        console.log(error);
    });

for (var i = lcl_images.length - 1; i >= 0; i--) {
    document.getElementById(lcl_images[i].key).src = value;
}



Promise
    .all(promises)
    .then(function(value) {
        console.log(value);
        document.getElementById(lcl_images[i].key).src = value;
        // I can't get the index i, no way to set <img> src for id attribute
    }) 
    .catch(function(error) {
        console.log(error);
    });

FIX Promise.all().then()

代码语言:javascript
复制
Promise
.all(promises)
.then(function(value) {
    console.log(value);
    for (var i = lcl_images.length - 1; i >= 0; i--) {
        document.getElementById(lcl_images[i].key).src = value[i];
    };
})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-22 13:57:32

Blobs更好,因为IndexedDB可以优化磁盘上的存储。本质上,它直接将它们存储为文件句柄。(在不支持Blobs或不支持IDB的情况下,LocalForage将转换为base64。)

要将图像下载为Blob,最简单的方法是使用fetch polyfill或fetch() API并使用response.blob() (参见MDN文档)。另一种方法是使用XMLHttpRequest并执行xhr.responseType = 'blob。示例:

代码语言:javascript
复制
fetch('http://example.com/myimage.gif').then(function (response) {
  return response.blob();
}).then(function (blob) {
  console.log("yay I have a blob", blob);
}).catch(console.log.bind(console))

另外,您应该知道的另一件事是,您在代码中似乎犯了一个典型的承诺错误,即在一个forEach()循环中执行多个承诺。您可能更愿意做Promise.all()。有关更多细节,请阅读我们对承诺有异议

对于使用Blobs,您可以查看有教程的水珠,也可以阅读附件的PouchDB指南。(PouchDB使用Blobs类似于LocalForage,因此建议类似。)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37964529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档