从background.js发送消息到没有监听器的popup.js

Joe*_*hel 1 javascript google-chrome message-queue listener google-chrome-extension

我有一个很长的任务正在运行background.js,我想popup.js在完成后发送一条消息.但是,如果在发送消息时未单击页面操作,则popup.js尚未注册侦听器,并且不会接收消息.

我可以从popup.js响应中发送消息并请求后台任务的结果.但是,无法保证任务将在该时间点完成.

我看到的唯一解决方案是两者的结合:在两个文件中设置一个监听器并来回发送消息,这样说:"如果你能听到我的话就会得到结果!" 并且"我现在可以听到了!如果你完成了,请给我一个结果." 但是,对于这样一个简单的任务,这个解决方案似乎过于复杂.

那么,是不是有一些地方background.js可以把结果popup.js放在自己的休闲时间检索?

wOx*_*xOm 5

  1. 持久性后台页面中存储一个全局变量,由于显而易见的内存效率原因,官方不鼓励使用它.

    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)
  2. 使用chrome.storage APIlocalStorage API(后者将所有内容字符串化,但由于同步,您的代码会更简洁一些).

  3. 使用正常的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)