9

次のコードを使用して、Chrome 拡張機能で名前と値のペアを設定および取得しようとしています。

if (!this.Chrome_getValue || (this.Chrome_getValue.toString && this.Chrome_getValue.toString().indexOf("not supported") > -1)) {
    this.Chrome_getValue = function (key, def) {
        chrome.storage.local.get(key, function (result) {
            return result[key];
        });
    };
    this.Chrome_setValue = function (key, value) {
        var obj = {};
        obj[key] = value;
        return chrome.storage.local.set(obj)
    }
}

次に、これらを次のように呼び出します。

Chrome_setValue("City", "London");

var keyValue = Chrome_getValue("City");

問題は、値を読み戻そうとするのに1秒の遅延を置いても、keyValueが常に「未定義」であることです。これは、「chrome.storage.local.get」関数が非同期であるためだと理解しています..次のコードは正常に動作します。

Chrome_setValue("City", "London");

chrome.storage.local.get("City", function (result) {
     alert(result["City"]);
});

(を使用して) keyValue をバインドするときgetに、関数が応答を返すまでコードを強制的に待機させる方法はありますか? あるいは、間違った角度からアプローチしているのかもしれません。基本的に、chrome.storage フレームワーク内でデータを処理するためのsetおよびメソッドを抽象化できる方法を探していますか? get理想的には、名前と値のペアを設定および取得するために呼び出すことができる 2 つの単純な関数です。

私が localStorage を使用する前は、非常に簡単でした。

//Set
localStorage["City"] = "London";

//Get
var keyValue = localStorage["City"];
4

2 に答える 2

3

まあ、それは基本的にchrome.storageAPI が非同期だからです。あなたは JavaScript の核となる何かに直面しています。

chrome.storage.getコールバックで実行されたものは によって返されませんchrome.storage.get。あなたはそれに対処する2つの方法があります:

  • コールバックでストレージ値を処理する
  • Promise パターンを使用して、コードの同期性を維持します(前の回答を参照)。

同期非同期の違いを本当に理解する必要があります。

于 2013-05-01T13:50:16.707 に答える