我正在编写Edge扩展,并在内容脚本和后台脚本之间进行通信。 我正在从内容脚本向背景1发送消息:
browser.runtime.sendMessage({ name: "get_card_for_website", url: document.URL }, function(response) {
console.log("Got card for the website:");
console.log(response);
if (response != undefined) {
if (response.card) {
g_card = response.card;
callback(response.card);
}
}
});
后台脚本中的监听器实现如下:
browser.runtime.onMessage.addListener(function (request, sender, sendResponse) {
if (request.name == 'get_card_for_website') {
get_card_for_website(request.url)
.done(function(element) {
if (element.cards && element.cards.length != 0) {
if (element.cards.length == 1) {
sendResponse({'card': element.cards[0]});
}
else {
get_one_card_for_site(element);
sendResponse({'card': ""});
}
}
});
}
}
调试器显示消息被发送到后台脚本,相应的代码执行到sendResponse。但是回到内容脚本中,这个回调函数永远不会被执行。控制台显示没有错误。 我能错过什么?
更新:我发现有些标签会收到回复而有些则没有。我真的不明白第一个和第二个之间的区别。
答案 0 :(得分:0)
好的,我找出了问题的原因。 sendResponse()在.done()函数中调用,该函数是异步调用的。并根据手册:
sendResponse 回调仅在同步使用或有效时才有效 事件处理程序返回 true 以指示它将响应 异步。
所以我用这种方式修改了我的后台脚本的功能:
rewrite lift_match
现在它的工作就像一个魅力。