web-dev-qa-db-ja.com

Chrome関数なしのストレージAPI値を返します

過去2日間、私はchrome非同期ストレージを使用しています。関数がある場合は「正常に」機能します(以下のように):

chrome.storage.sync.get({"disableautoplay": true}, function(e){
console.log(e.disableautoplay);
});

私の問題は、私がやっていることで関数を使用できないことです。 LocalStorageのように、それを返すだけです。何かのようなもの:

var a = chrome.storage.sync.get({"disableautoplay": true});

または

var a = chrome.storage.sync.get({"disableautoplay": true}, function(e){
    return e.disableautoplay;
});

パブリック変数を設定してそれを設定することさえ、私は百万の組み合わせを試しました:

var a;
window.onload = function(){
    chrome.storage.sync.get({"disableautoplay": true}, function(e){
    a = e.disableautoplay;
});
}

何も機能しません。それを参照するコードがget関数の内部にない限り、すべて未定義を返します。それは私には役に立ちません。値を変数として返すことができるようにしたいだけです。

これは可能ですか?

編集:この質問は重複ではありません、理由を説明させてください:

1:これを具体的に尋ねる他の投稿はありません(念のため、最初に2日間費やしました)。

2:私の質問はまだ答えられていません。はい、Chromeストレージは非同期で、はい、値を返しません。それが問題です。以下で詳しく説明します...

Chrome.storage.sync.get関数の外で保存された値を取得できるようにする必要があります。 localStorageはURL固有であり、chrome拡張機能のbrowser_actionページとbackground.jsの両方から同じ値にアクセスできないため、使用できません。値を保存できません。 1つのスクリプトで別のスクリプトにアクセスします。これらは別々に扱われます。

したがって、私の唯一の解決策はChrome Storageを使用することです。保存されたアイテムの値を取得し、それをget関数の外で参照する方法がいくつかあるはずです。ifステートメントでチェックする必要があります。

LocalStorageができるように

if(localStorage.getItem("disableautoplay") == true);

の線に沿って何かをするための何らかの方法が必要です

if(chrome.storage.sync.get("disableautoplay") == true);

それはそれほど単純なことではないことに気づきましたが、それが私がそれを説明できる最良の方法です。

私が見るすべての投稿は、このようにすることを言っています:

chrome.storage.sync.get({"disableautoplay": true, function(i){
    console.log(i.disableautoplay);
    //But the info is worthless to me inside this function.
});
//I need it outside this function.
18
Kyle Hickey

メイン関数を「非同期」にし、その中に「約束」を作成します:)

async function mainFuction() {
    var p = new Promise(function(resolve, reject){
        chrome.storage.sync.get({"disableautoplay": true}, function(options){
            resolve(options.disableautoplay);
        })
    });

    const configOut = await p;
    console.log(configOut);
}
3
Ganu
  1. chrome.storage.sync.get には戻り値がないため、次のような呼び出しでundefinedが返される理由が説明されています

    var a = chrome.storage.sync.get({"disableautoplay": true});
    
  2. chrome.storage.sync.getasynchronous メソッドであり、コールバック関数内でアクセスしない限り、次のコードでaundefinedになる理由を説明しています。

    var a;
    window.onload = function(){
        chrome.storage.sync.get({"disableautoplay": true}, function(e){
            // #2
            a = e.disableautoplay; // true or false
        });
        // #1
        a; // undefined
    }
    
2
Haibara Ai

はい、あなたはpromiseを使用してそれを達成できます:

let getFromStorage = keys => new Promise((resolve, reject) =>
  chrome.storage.sync.get(...keys, result => resolve(result)));
0
nenadg

これをうまく処理することができれば、奇妙なバグの原因となっているでしょう。メッセージは非同期で実行されます。つまり、メッセージを送信すると、非同期関数が戻る前に、残りのコードを実行できます。 chromeはマルチスレッドであり、get関数が遅延する可能性があるため、つまり、hddがビジー状態であるため、保証はありません。コードを例として使用すると、次のようになります。

var a;
window.onload = function(){
    chrome.storage.sync.get({"disableautoplay": true}, function(e){
    a = e.disableautoplay;
});
}

if(a)
   console.log("true!");
else
   console.log("false! Maybe undefined as well. Strange if you know that a is true, right?");

したがって、次のようなものを使用する方が良いでしょう:

chrome.storage.sync.get({"disableautoplay": true}, function(e){
    a = e.disableautoplay;
    if(a)
      console.log("true!");
    else
      console.log("false! But maybe undefined as well");
});

本当にこの値を返したい場合は、JavaScriptストレージAPIを使用してください。これは文字列値のみを保存するため、保存する前と取得した後で値をキャストする必要があります。

//Setting the value
localStorage.setItem('disableautoplay', JSON.stringify(true));

//Getting the value
var a = JSON.stringify(localStorage.getItem('disableautoplay'));
0
ze_iliasgr