从chrome扩展中的后台页面到内容脚本进行配置

时间:2015-03-04 19:16:10

标签: javascript google-chrome google-chrome-extension

我试图从我的Chrome扩展程序的后台页面获取一些用户配置到内容脚本(或弹出窗口),但我遇到了一些问题,我认为问题在于chrome.storage。 sync.get是异步的,我尝试使用回调,但我也读到回调函数无法返回值,所以我不知道如何解决这个问题。

以下是代码的外观:

popup.js:

(function() {
  chrome.runtime.sendMessage({
    message: "loadconfig"
  }, function(response) {
    console.log(response);
    if (response.status === 'success') {
      console.log(response);
    } else {
      console.log(response.except);
    }
  });
})();

background.js

(function() {
  chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    switch (request.message) {
      case "loadconfig":
        sendResponse(loadStuff());
        break;
      default:
        sendResponse({
          reply: null
        });
        break;
    }
  });
  function loadStuff() {
    var to_return_configs = {
      blocked_characters: '',
      good_post: ''
    };
    var function_status = 'failed';
    var exception = '';
    var blocked_characters_parsed, good_post_parsed;

    try {
      var to_get = ["blocked_characters_saved", "good_post_saved"];
      chrome.storage.sync.get(to_get, function(result) {
        to_get.forEach(function(got) {
          if (got === "good_post_saved") {
            to_return_configs.good_post = result[got];
          }
          if (got === "blocked_characters_saved") {
            to_return_configs.blocked_characters = result[got];
          }
        });
      });
      exception = '';
      function_status = 'success';
    } catch (err) {
      exception = String(err);
      function_status = 'failed';
    }
    var to_return = {
      status: function_status,
      configs: to_return_configs,
      except: (exception)
    };
    return to_return;
  }
})();

这里的问题是,当我查看popup.js控制台时," blocked_characters"和" good_post"都是空的。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

Popup和Background之间的通信不需要Message API。 chrome扩展中的弹出窗口可以直接调用Background的方法。

您可以执行this

之类的操作
BG = chrome.extension.getBackgroundPage();

然后你可以在你的弹出窗口中调用BG.loadStuff()

在loadStuff中,您可以传递一个可以向您返回数据的回调。所以看起来应该是

BG.loadStuff(function(items) {
  console.log(items);
});

background.js

function loadStuff(cb) {
  chrome.storage.sync.get(null, function(superObj) {
    cb.call(null, superObj);
  });
}

要了解更多信息,请阅读这些

  1. http://blog.papersapp.com/chrome-development-parent-and-child-windows/
  2. https://stackoverflow.com/a/17276475/816213
  3. https://stackoverflow.com/a/17378016/816213

答案 1 :(得分:0)

当事件侦听器返回时,

sendResponse(function)变为无效,除非您从事件侦听器返回true以指示您希望异步发送响应(这将使消息通道保持打开到另一端,直到{{1} } 叫做)。请参阅参考:onMessage

因为在sendResponse的回调中异步调用sendResponse,所以需要从chrome.storage.sync.get侦听器返回true以防止该函数失效。代码类似于:

onMessage