Fra*_*coN 0 javascript blob local-storage promise localforage
我对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;
});
}
}
Run Code Online (Sandbox Code Playgroud)
关键是,我不知道这是否是使用图像的正确方法:我将它们存储为字符串,localForage应该使用parse和stringify。
这个示例运行良好(当我脱机时,刷新页面,本地存储中的图像是可变的),但是我看到有人在使用Image对象或Blob(我听说过,而且即时搜索并没有告诉我太多信息)那)。其他人则请求XHR下载图像,然后将其保存。
我可以考虑使用XHR请求来检查是否已下载图像。这是正确的吗?
其次:有人说用斑点存储更好。为什么?
请帮助我,谢谢。
编辑(多个承诺)
当我检索图像时,必须将它们各自绑定到<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);
});
Run Code Online (Sandbox Code Playgroud)
修复 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];
};
})
Run Code Online (Sandbox Code Playgroud)
Blob更好,因为IndexedDB可以优化其在磁盘上的存储。本质上,它将它们直接存储为文件句柄。(如果不支持Blob或不支持IDB,则LocalForage将转换为base64。)
要将图像下载为Blob,最简单的方法是使用访存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))
Run Code Online (Sandbox Code Playgroud)
您还应该知道的另一件事是,您似乎在代码中犯了一个经典的Promise错误,即在一个forEach()循环中执行多个Promises 。您可能宁愿这样做Promise.all()。请阅读我们对承诺有疑问,以获取更多详细信息。
要使用Blob,可以查看具有教程的blob-util,也可以阅读附件的PouchDB指南。(PouchDB使用Blob的方式类似于LocalForage,因此建议类似。)
| 归档时间: |
|
| 查看次数: |
1715 次 |
| 最近记录: |