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

时间:2015-08-14 06:42:23

标签: javascript google-chrome google-chrome-extension listener message-queue

我有一个在background.js中运行的长任务,我希望在完成后向popup.js发送消息。但是,如果在发送邮件时未单击页面操作,则popup.js中的侦听器尚未注册,并且将不会收到该邮件。

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

我看到的唯一解决方案是两者的结合:在两个文件中设置一个监听器并来回发送消息,如下所示:"如果您能听到我的话,这就是结果! "和#34;我现在可以听到了!如果您已完成,请将结果发送给我。"但是,对于这样一个简单的任务,这个解决方案似乎过于复杂。

那么,是不是background.js可以将popup.js的结果放在FooA以便自行恢复的地方?

1 个答案:

答案 0 :(得分:5)

  1. 持久性后台页面中存储一个全局变量,其中使用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);
    });
    
  2. 使用chrome.storage APIlocalStorage API(后者将所有内容整合在一起,但由于同步,您的代码会更加简洁。)

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