我试图从我的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"都是空的。
我该如何解决这个问题?
答案 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 :(得分:0)
sendResponse(function)
变为无效,除非您从事件侦听器返回true以指示您希望异步发送响应(这将使消息通道保持打开到另一端,直到{{1} } 叫做)。请参阅参考:onMessage。
因为在sendResponse
的回调中异步调用sendResponse
,所以需要从chrome.storage.sync.get
侦听器返回true以防止该函数失效。代码类似于:
onMessage