2

我正在将 Chrome 扩展的持久性存储库从 localStorage 迁移到 chrome.storage。它们之间的一个重要区别是 chrome.storage 是异步的,因此需要传递一个回调函数。

您将如何修改将写入 localStorage 的循环同步到异步 chrome.storage?

for (var i = 0; i < obj.length; i++) {
    localStorage.setItem(obj[i].key, obj[i].val);
}
doThisWhenAllElementsAreSaved();

谢谢。

4

3 回答 3

1

对于此示例,我将使用,但如果您愿意chrome.storage.local,可以将其替换为。chrome.storage.sync

目标是使用chrome.storage.local.set. 第一步是将您obj的对象转换为包含键/值对列表的对象:

var keyValue = {};
for (var i = 0; i < obj.length; i++) 
{
    keyValue[obj[i].key] = obj[i].val;
}

然后我们调用实际的方法:

chrome.storage.local.set(keyValue, function()
{     
   // Notify that we saved.
   doThisWhenAllElementsAreSaved();
});

或者,简单地说:

chrome.storage.local(keyValue, doThisWhenAllElementsAreSaved);

请注意,回调将在成功和失败时调用。如果存储失败,chrome.runtime.lastError则将被设置。

于 2013-10-13T13:00:53.107 回答
1

您可以使用 API 一次保存多个项目chrome.storage,因此我将使用以下方法:

之前,使用localStorage.setItem

for (var i = 0; i < obj.length; i++) {
    localStorage.setItem(obj[i].key, obj[i].val);
}
doThisWhenAllElementsAreSaved();

之后,使用chrome.storage.local.set

var items = {};
for (var i = 0; i < obj.length; i++) {
    items[obj[i].key] = obj[i].val;
}
chrome.storage.local.set(items, function() {
    doThisWhenAllElementsAreSaved();
});

如果您需要知道保存操作是否成功,请检查chrome.runtime.lastError回调中的值。

于 2013-10-13T12:59:30.097 回答
0

chrome.storage.local最好的做法就是像其他人所说的那样更改要使用的代码。

但有时,它会变得非常混乱,您可能希望一些代码保持不变。

我尝试使用一个高度集成window.localStorage在打包应用程序环境中的库(该库是 angular-cached-resource)并且不想更改原始源代码。所以我设法制作了以下垫片:https ://github.com/stewartpark/chrome-localStorage-shim

希望能帮助到你!快乐的黑客。

于 2015-07-07T06:34:43.063 回答