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他の人が言ったように使用するコードを変更することです。

しかし、場合によっては非常に面倒になり、一部のコードをそのままにしておきたい場合があります。

パッケージ化されたアプリ環境に高度に組み込まれたライブラリ(ライブラリはangular-cached-resourceでした)を使用しようとしましwindow.localStorageたが、元のソースコードを変更したくありませんでした。だから私は次のシムを作ることができました: https://github.com/stewartpark/chrome-localStorage-shim

それが役に立てば幸い!ハッピーハッキング。

于 2015-07-07T06:34:43.063 に答える