如标题中所述,我正在尝试编写一个后台脚本,该脚本将侦听来自popup.js或contentscript.js的加载请求。收到负载后,它将获取chrome.storage.local的内容,执行一点数据处理(for循环)并将其发送给请求者。
当前的问题是我的代码接收到请求,但是无法发送回数据。我的代码如下:
popup.js:
chrome.runtime.sendMessage({greeting: "Load"}, function(response) {
console.log(response);
}
background.js:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if(request.greeting=='Load') {
chrome.storage.local.get(null,function(storeObject){
var newList=[];
//Perform some dataprocessing to store part of storeObject into newList
sendResponse(newList);
});
}
});
我认为问题与范围有关,因为在调试后,它看起来像sendResponse正在尝试从chrome.storage发送而不是background.js发送。另外,如果我在chrome.storage.local回调之前/之后发送消息,popup.js会收到消息。
根据`chrome.runtime.onMessage上的文档:
sendResponse(function)
[...]事件侦听器返回时,此函数将变为无效,除非您从事件侦听器返回true表示您希望异步发送响应(这将使消息通道向另一端开放,直到sendResponse叫做)。
由于sendResponse
在chrome.storage.local.get()
的回调中异步调用,因此您需要从onMessage
侦听器返回true,以防止该函数失效。
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.greeting === 'Load') {
chrome.storage.local.get(null, function(storeObject) {
...
sendResponse(newList);
});
return true; // <-- I intend to call `sendResponse` later
}
return false; // <-- I do NOT intend to call `sendResponse`
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句