過去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.
メイン関数を「非同期」にし、その中に「約束」を作成します:)
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);
}
chrome.storage.sync.get
には戻り値がないため、次のような呼び出しでundefined
が返される理由が説明されています
var a = chrome.storage.sync.get({"disableautoplay": true});
chrome.storage.sync.get
も asynchronous メソッドであり、コールバック関数内でアクセスしない限り、次のコードでa
がundefined
になる理由を説明しています。
var a;
window.onload = function(){
chrome.storage.sync.get({"disableautoplay": true}, function(e){
// #2
a = e.disableautoplay; // true or false
});
// #1
a; // undefined
}
はい、あなたはpromiseを使用してそれを達成できます:
let getFromStorage = keys => new Promise((resolve, reject) =>
chrome.storage.sync.get(...keys, result => resolve(result)));
これをうまく処理することができれば、奇妙なバグの原因となっているでしょう。メッセージは非同期で実行されます。つまり、メッセージを送信すると、非同期関数が戻る前に、残りのコードを実行できます。 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'));