Joe*_*hel 1 javascript google-chrome message-queue listener google-chrome-extension
我有一个很长的任务正在运行background.js,我想popup.js在完成后发送一条消息.但是,如果在发送消息时未单击页面操作,则popup.js尚未注册侦听器,并且不会接收消息.
我可以从popup.js响应中发送消息并请求后台任务的结果.但是,无法保证任务将在该时间点完成.
我看到的唯一解决方案是两者的结合:在两个文件中设置一个监听器并来回发送消息,这样说:"如果你能听到我的话就会得到结果!" 并且"我现在可以听到了!如果你完成了,请给我一个结果." 但是,对于这样一个简单的任务,这个解决方案似乎过于复杂.
那么,是不是有一些地方background.js可以把结果popup.js放在自己的休闲时间检索?
在持久性后台页面中存储一个全局变量,由于显而易见的内存效率原因,官方不鼓励使用它.
background.js:
var status;
Run Code Online (Sandbox Code Playgroud)
popup.js,方法1,异步,首选:
chrome.runtime.getBackgroundPage(function(bg) {
displayStatus(bg.status);
});
Run Code Online (Sandbox Code Playgroud)
popup.js,方法2,同步:
if (chrome.extension.getBackgroundPage().status) {
displayStatus(bg.status);
});
Run Code Online (Sandbox Code Playgroud)使用chrome.storage API或localStorage API(后者将所有内容字符串化,但由于同步,您的代码会更简洁一些).
使用正常的sendMessage通信,它没有什么过于复杂:
background.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});
}
Run Code Online (Sandbox Code Playgroud)
popup.js:
chrome.runtime.sendMessage({request: "checkStatus"}, function(response) {
if (response.done) {
doSomething();
}
});
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
if (message.done) {
doSomething();
}
});
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
3207 次 |
| 最近记录: |