【问题标题】:LocalForage, images and BlobsLocalForage、图像和 Blob
【发布时间】:2016-10-24 04:31:46
【问题描述】:

我对 LocalForage 的使用有点困惑。 我只是想从 LocalForage 保存和检索图像,我就是这样做的。

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这个例子运行良好(当我离线时,我刷新页面,localstorage 中的图像是可见的),但我看到有人使用 Image 对象或 Blob(我从来没有听说过,并且即时搜索没有告诉我太多关于那的事)。 其他人做一个 XHR 请求来下载图像,然后他们保存它。

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

其次:有人说用 blob 存储更好。为什么?

请帮帮我,谢谢。

编辑(多个承诺)

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

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);
    });

修复 Promise.all().then()

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];
    };
})

【问题讨论】:

    标签: javascript promise local-storage blob localforage


    【解决方案1】:

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

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

    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))
    

    您还应该知道的另一件事是,您似乎在代码中犯了一个经典的 Promise 错误,即在 forEach() 循环中执行多个 Promise。你可能宁愿做Promise.all()。请阅读We have a problem with promises了解更多详情。

    关于使用 Blob,您可以查看有教程的 blob-util,或者您可以阅读 the PouchDB guide to attachments。 (PouchDB 使用 Blob 与 LocalForage 类似,因此建议类似。)

    【讨论】:

    • 感谢您的回复,帮助很大。但是我遇到了promise.all的麻烦。由于无法运行循环,我不知道如何将图像id(存储在key中)与img src(存储在value中)绑定。
    • Promise.all 给你一个数组的承诺。在您的代码中,您似乎假设 value 是一个单一的东西,而不是一个数组。
    • 你回复的时候我正在开发,我要编辑这个。所以,只是指出一个问题:如果我想等到所有图像都下载完毕,我应该添加var is_all_stored=falsepromise.then(value){ is_all_stored=true;}。这样一来,我就可以在全部存储后下线,对吗?
    • 一个关于 polyfill 的问题:它应该复制 xhr 的行为,在所有版本的浏览器上都可用.. 但是查看 github.com/github/fetch#browser-support 它仅受最新版本的主要浏览器和 IE 支持10+。真的吗? developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch 报告 fetch 原生支持 FF 39、Chrome 42。
    • 嗨,那里有很多 fetch() polyfill;希望你能找到一个支持你想要的浏览器的。否则,您可以像平常一样使用 XMLHttpRequest 并将其包装在 Promise 中,或者使用原生支持 Promises 和 $.ajax() 的 jQuery 3.0 来做到这一点。
    猜你喜欢
    • 2017-01-03
    • 2015-07-29
    • 2021-10-26
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2012-02-02
    • 2015-10-28
    • 2021-06-10
    相关资源
    最近更新 更多