在 Firefox 的 content.js 中调用 browser.storage.local.get() 后无法 console.log()

Can't console.log() after calling browser.storage.local.get() in content.js in Firefox

content.js 在控制台中的最后输出是 console.log("gggggg");

这些语句永远不会 运行(控制台中没有错误):

alert("gucci");
console.log("p");
console.log("o",current_languages);
  alert("string");
  console.log(e);

content.js

myCollection1 = document.getElementsByClassName("tocnumber");
myCollection2 = document.getElementsByClassName("toctext");
var languages = []; //jazyky na stránce
var i;
var position;
for (i = 0; i < myCollection1.length; i++) {
  if (Number.isInteger(Number(myCollection1[i].innerText))){
    languages.push(myCollection2[i].innerText);
  }  
} 
console.log("gggggg");
var zvyraznit = browser.storage.local.get('zvyraznit_preklady'); //v kterých jazycích
zvyraznit.then(function(e){
  var barva = browser.storage.local.get('colour');//.split(","); //seznam jazyk, barva
});
barva.then(function(e){
  var current_languages = browser.storage.local.get('jazyky1'); //"španělština"
});
alert("gucci");
var current_language;
console.log("p");
console.log("o",current_languages);
current_languages.then(function(e){
  alert("string");
  console.log(e);
  let current_languages_list = String(e.current_languages).split(",");
  console.log("l",languages);

其他代码,所以你可以 运行 插件:

manifest.json

{
    "manifest_version": 2,
    "name": "Vylepšení pro wikislovník",
    "version": "0.2",
    "content_scripts": [
        {
            "matches": ["*://*.cs.wiktionary.org/*"],
            "js": [ "content.js"],
            "run_at": "document_end"
        }],
    "background": {
      "scripts": ["background.js"]
    },
    "browser_action": {
      "default_title": "Vylepšení pro wikislovník - Nastavení"
    },
    "permissions": ["storage"],
    "options_ui": {
    "page": "options.html",
    "browser_style": false
    }
}

background.js

function handleClick() {
  browser.runtime.openOptionsPage();
}

browser.browserAction.onClicked.addListener(handleClick);

options.html 和 options.js

document.getElementsByClassName("submit")[0].onclick = function(){document.getElementById("saved").style.display = "block";}
function saveOptions(e) {
  e.preventDefault();
  let storageItem = browser.storage.local.set({
    jazyky1: document.getElementById("jazyky1").value,
    zvyraznit_preklady: document.getElementById("zvyraznit_preklady").value, //a
    colour: document.querySelector("#colour").value //b
  });
}

function restoreOptions() {
  let storageItem = browser.storage.local.get('jazyky1');
  storageItem.then((res) => {
      if(res.jazyky1 == undefined){
       resetOptions();
    }else{
      document.getElementById("jazyky1").value = String(res.jazyky1);
    }
  });
  storageItem = browser.storage.local.get('zvyraznit_preklady');
  storageItem.then((res) => {
    if(res.jazyky1 == undefined){
    }else{
      document.getElementById("zvyraznit_preklady").value = String(res.zvyraznit_preklady);
    }
  });
  storageItem = browser.storage.local.get('colour');
  storageItem.then((res) => {
    if(res.jazyky1 == undefined){
    }else{
      document.getElementById("colour").value = String(res.colour);
    }
  });
}
function resetOptions(e){
  let clearing = browser.storage.local.clear();
  clearing.then(function(e){
    let storageItem = browser.storage.local.set({
    jazyky1: "němčina",
    zvyraznit_preklady: "němčina",
    colour: "yellow"
    });
  document.getElementById("jazyky1").value = "němčina";
  document.getElementById("zvyraznit_preklady").value = "de";
  document.getElementById("colour").value = "yellow";
  storageItem.then(function(e){restoreOptions();}); 
  });
}

  

document.addEventListener('DOMContentLoaded', restoreOptions);
document.querySelector("form").addEventListener("submit", saveOptions);
document.getElementById("reset").addEventListener("reset", resetOptions);
<!DOCTYPE html>
<html>
  <head>
    <title>Vylepšení pro Wikislovník</title>
    <meta charset="utf-8">
  </head>
  <style>
    h1 {
      color: #008844;
      text-shadow: 10px 10px black;
    }
    h2{
      font-family: Consolas;
    }
    button {
      min-height: 32px;
    }
    .submit {
      background-color: #00ddff;
      border: none;
      border-radius: 4px;
      padding: 3px 10px;
      font-weight: 600;
      cursor: grab;
    }
    .submit:active {
      transform: translateY(2px);
    }
    @media (prefers-color-scheme: dark) {
    body { background-color:  #333; color: white; 
    }
    }
    a {
      color: aquamarine;
    }
  </style>
<body>
  <center>
  <form>
  <h1>Vylepšení pro (český) Wikislovník pro hesla v jazyce němčina a čeština</h1>
  <p>Ale i pro další jazyky, tam jsem to ale netestoval.</p>
  <h2>1.) Posunutí sekce "význam" před tabulku deklinace pro slovesa</h2>
  <p>Jazyky zadávejte zcela obyčejným způsobem, oddělujte čárkou (př. němčina, španělština).</p>
  
  <label>Pokud chcete přidat další jazyky</label>
  <input type="text" id="jazyky1" >
  
  <h2>2.) Zvýraznění překladů v jazyce:</h2>
  <p><b>Poznámka:</b>Tady napište kód jazyka který chcete v sekci překlady zvýraznit (př. pro němčinu <b>de</b>, španělštinu <b>es</b>, angličtinu <b>en</b>, francoužštinu <b>fr</b>, ruštinu <b>ru</b>, atd. Oddělujte čárkou.<br>
  (Já jsem to nevymyslel) </p>
  
  <label>Přidat jazyky</label>
  <input type="text" id="zvyraznit_preklady" >
  
  <p><b>Poznámka:</b>Tady napište barvu/barvy, kterými chcete jednotlivé překlady zvýraznit. Pište ve tvaru kód jazyka, barva. Možné barvy jsou yellow (žlutá), green (zelená), a <a href= https://cs.wikipedia.org/wiki/Wikipedie:Tabulka_barev#Slovn%C3%AD_k%C3%B3dy_barev target="_blank">jiné názvy barev anglicky</a>. Pokud chcete zadat vlastní barvu, zkopírujte její kód HEX (<a href = https://www.google.com/search?q=color+picker target="_blank">vybírátko barev najdete tady</a>)  Oddělujte čárkou.<br>
  </p>
  
  <label>Vybrat barvu</label>
  <input type="text"  placeholder= "de, green" id="colour" >
  <br>
  <br>
  <button class="submit" type="submit">Uložit změny</button>
  <button id = "reset" type="reset">Obnovit původní hodnoty</button>
  <br>
  <p id="saved" style="font-family: Consolas;color: green;display:none;">Saved!</p>
  <script src="options.js"></script>
  </form>
  </center>
</body>

</html> 

抱歉,我的代码有点罗嗦 :)

注意:您不需要 post options.htmloptions.js.

这里是问题...

console.log("gggggg");
var zvyraznit = browser.storage.local.get('zvyraznit_preklady'); //v kterých jazycích
zvyraznit.then(function(e){
  var barva = browser.storage.local.get('colour');//.split(","); //seznam jazyk, barva
});

// here ... brava is not defined since it was defined inside another function
barva.then(function(e){
  var current_languages = browser.storage.local.get('jazyky1'); //"španělština"
});

您需要链接 Promise 或使用 async/await,例如

var zvyraznit = browser.storage.local.get('zvyraznit_preklady'); //v kterých jazycích
zvyraznit.then(function(e){
  var barva = browser.storage.local.get('colour');//.split(","); //seznam jazyk, barva
  barva.then(function(e){
    var current_languages = browser.storage.local.get('jazyky1'); //"španělština"
  });
});

如果你打算使用then(),那么并不总是需要设置变量名,例如

browser.storage.local.get('colour').then(function(e){
  browser.storage.local.get('jazyky1').then( /*.......*/ );
});

您也可以使用async/await
注意:最好声明变量。

(async() => {

  const myCollection1 = document.getElementsByClassName("tocnumber");
  const myCollection2 = document.getElementsByClassName("toctext");
  const languages = []; //jazyky na stránce

  for (let i = 0; i < myCollection1.length; i++) {
    if (Number.isInteger(Number(myCollection1[i].innerText))){
      languages.push(myCollection2[i].innerText);
    }  
  } 
 
  console.log("gggggg");
  const zvyraznit = await browser.storage.local.get('zvyraznit_preklady'); //v kterých jazycích
  const barva = await browser.storage.local.get('colour');//.split(","); //seznam jazyk, barva
  const current_languages = await browser.storage.local.get('jazyky1'); //"španělština"
  
  alert("gucci");

  console.log("p");
  console.log("o", current_languages);

  alert("string");
  console.log(e);
  let current_languages_list = String(e.current_languages).split(",");
  console.log("l",languages);

})();

以上代码中,最好一次获取存储,例如

  const result = await browser.storage.local.get();
  const zvyraznit = result.zvyraznit_preklady; //v kterých jazycích
  const barva = result.colour;//.split(","); //seznam jazyk, barva
  const current_languages = result.jazyky1; //"španělština" 

如果你不想使用async/await,那么这里有一个例子:

browser.storage.local.get().then(process);

function process(storage) {

  const myCollection1 = document.getElementsByClassName("tocnumber");
  const myCollection2 = document.getElementsByClassName("toctext");
  const languages = []; //jazyky na stránce

  for (let i = 0; i < myCollection1.length; i++) {
    if (Number.isInteger(Number(myCollection1[i].innerText))){
      languages.push(myCollection2[i].innerText);
    }
  }

  console.log("gggggg");

  const zvyraznit = storage.zvyraznit_preklady; //v kterých jazycích
  const barva = storage.colour;//.split(","); //seznam jazyk, barva
  const current_languages = storage.jazyky1; //"španělština"

  alert("gucci");

  console.log("p");
  console.log("o", current_languages);

  alert("string");
  console.log(e);
  let current_languages_list = String(e.current_languages).split(",");
  console.log("l",languages);
}