Невозможно выполнить обратный вызов chrome .storage.local.set во всплывающем окне. js - PullRequest
0 голосов
/ 19 июня 2020

Я пишу простое расширение chrome, которое содержит всплывающее окно HTML (popup.html) с соответствующим файлом popup.js. Когда пользователь нажимает кнопку в popup.js, я хотел бы получить и установить значение, используя chrome.storage.local.get и chrome.storage.local.set. После этого процесса я хотел бы уведомить пользователя, что обновление завершено (с помощью простого jQuery). Однако я поместил этот код обновления jQuery в обратный вызов моего chrome.storage.local.set, и при нажатии кнопки обновление Dynami c никогда не происходит, поэтому я подозреваю, что обратный вызов никогда не выполнялся. Я считаю, что это так, потому что я поместил фрагмент уведомления внутри обратного вызова chrome.storage.local.get и смог отобразить правильное сообщение:

popup.html:

<html>
   <head>
      <title>Test Extensio</title>
      <script src='jquery.min.js'></script>
      <script src='popup.js'></script>
  </head>
  <body>
       <button class='get-notified'>Run Test</button>
       <div class='update-display'></div>
  </body>
</html>

popup.js:

$(document).ready(function(){
    $('body').on('click', '.get-notified', function(){
       chrome.storage.local.get(['counter'], function(result){
          var new_count = result.counter === undefined ? 1 : parseInt(result.counter)+1
          chrome.storage.local.set({'counter':new_count}, function(){
             $('.update-display').html(`The count is: ${new_count}`)
             //this is never executed
          });
       });
    });
});

В приведенном выше примере кода сообщение счетчика никогда не отображается. Однако, когда я удаляю chrome.storage.local.set и запускаю обновление внутри обратного вызова chrome.storage.local.get, оно действительно работает:

chrome.storage.local.get(['counter'], function(result){
    var new_count = result.counter === undefined ? 1 : parseInt(result.counter)+1
    $('.update-display').html(`The count is: ${new_count}`)
    //this works
});

Почему $('.update-display').html(...) работает в первом обратном вызове, обратном вызове chrome.storage.local.get, но не внутренний обратный вызов chrome.storage.local.set?

Мой manifest.json файл:

{
  "manifest_version": 2,
  "name": "Test extension",
  "description": "A Description coming soon",
  "version": "2.0",
  "browser_action": {
     "default_icon": "/images/icon.png",
     "default_popup": "popup.html"
   },
   "background" : {
     "scripts" : ["jquery.min.js", "popup.js"]
   },
   "permissions": [
   "storage",
   "activeTab",
   "declarativeContent",
   "webNavigation",
   "unlimitedStorage",
   "tabs",
   "cookies",
   "webRequest",
   "webRequestBlocking",
   "http://*/",
   "https://*/",
   "http://fonts.googleapis.com/",
   "https://fonts.googleapis.com/"

 ],

   "web_accessible_resources": ["popup.html"],
  ....
 }

Кто-нибудь знает, почему может возникнуть такое непонятное поведение? Спасибо большое!

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Для тех, кто заинтересован, я обнаружил проблему: я добавил window.close() над моим chrome.storage.local.get, который неизбежно закрывал всплывающее окно после того, как пользователь нажимал кнопку определенное количество раз. Я просто переместил window.close в свой исходный обратный вызов, и chrome.storage.local.set работал нормально:

/*this did not work
if (somecondition){
    window.close();
}
*/
chrome.storage.local.get(['counter'], function(result){
   var new_count = result.counter === undefined ? 1 : parseInt(result.counter)+1
    chrome.storage.local.set({'counter':new_count}, function(){
        $('.update-display').html(`The count is: ${new_count}`)
        //this worked
        if (somecondition){
            window.close();
        }
    });
 });
0 голосов
/ 19 июня 2020

.set не принимает обратный вызов , он возвращает Promise.

Вам просто нужно сделать:

chrome.storage.local.set({'counter':new_count}).then(function(){
    $('.update-display').html(`The count is: ${new_count}`)
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...