我有一个在background.js
中运行的长任务,我希望在完成后向popup.js
发送消息。但是,如果在发送邮件时未单击页面操作,则popup.js
中的侦听器尚未注册,并且将不会收到该邮件。
我可以从popup.js
发送消息,并请求后台任务的结果作为回应。但是,无法保证任务将在那个时间点完成。
我看到的唯一解决方案是两者的结合:在两个文件中设置一个监听器并来回发送消息,如下所示:"如果您能听到我的话,这就是结果! "和#34;我现在可以听到了!如果您已完成,请将结果发送给我。"但是,对于这样一个简单的任务,这个解决方案似乎过于复杂。
那么,是不是background.js
可以将popup.js
的结果放在FooA
以便自行恢复的地方?
答案 0 :(得分:5)
在持久性后台页面中存储一个全局变量,其中使用officially discouraged是显而易见的内存效率原因。
background.js:
%dw 1.0
%output application/java
---
{
internalId : 123456,
tranId : 'TR-2016-01',
customFieldList : {
customField : [
StringCustomFieldRef__custbody_payment_url : 'http://www.example.com'
]
}
}
popup.js,方法1,异步,首选:
var status;
popup.js,方法2,同步:
chrome.runtime.getBackgroundPage(function(bg) {
displayStatus(bg.status);
});
使用chrome.storage API或localStorage API(后者将所有内容整合在一起,但由于同步,您的代码会更加简洁。)
使用正常的sendMessage通信,其中没有任何过于复杂的内容:
background.js:
if (chrome.extension.getBackgroundPage().status) {
displayStatus(bg.status);
});
popup.js:
var taskCompleted = false;
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
if (message.request == "checkStatus") {
sendResponse({done: taskCompleted});
}
});
.................
if (taskCompleted) {
chrome.runtime.sendMessage({done: true});
}