Chrome扩展程序消息队列

时间:2016-06-24 09:11:22

标签: javascript google-chrome google-chrome-extension

我正在开发chrome扩展,在完成一些额外的脚本之后,我遇到了消息传递问题。我写了一些测试代码,并注意到,onMessage监听器一次只能从一个脚本处理消息。这是测试代码:

background.js

sendKeys()

此后台脚本侦听并发送每条消息的响应。

first.js

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    console.log(request.action);
    if (request.action == 'first') {
         sendResponse({ action: 'first_next', arg: 1 });
    } else
    if (request.action == 'second') {
        sendResponse({ action: 'second_next', arg: 1 });
    }

    return true;
});

chrome.tabs.executeScript(active_tab, {file: 'first.js'});
chrome.tabs.executeScript(active_tab, {file: 'second.js'});

second.js

function wait() {
    done('OK');
}

function done(result) {
    var msg = { action: 'first', result: result };
    chrome.runtime.sendMessage(msg, function(response) {
        if (response.action === 'first_next') {
            setTimeout(wait, 400);
        } else 
        {
            setTimeout(wait, 2000);
        }
    });
}

wait();

因此,控制台日志应该是:

function wait() {
    done('OK');
}

function done(result) {
    var msg = { action: 'second', result: result };
    chrome.runtime.sendMessage(msg, function(response) {
        if (response.action === 'second_next') {
            setTimeout(wait, 400);
        } else 
        {
            setTimeout(wait, 2000);
        }
    });
}

wait();

但是,它是:

first
second
first
...
first
first
second
first
second
...

这表示我只能及时处理一条消息。我不知道如何解决我的问题,也许像消息队列(idk如何做到这一点)或其他东西?提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

此处的问题与Chrome API无关。您有两个具有相同名称的函数注入页面。所以基本上会发生以下情况:

  1. 您注入first.js并执行done功能
  2. 您注入second.js并执行done功能
  3. 来自done
  4. second.js覆盖了done
  5. first.js的定义
  6. 每次first.js拨打done时,它都会调用done中定义的second.js
  7. 要查看相关证明,请将done中的second.js更改为done2,然后执行代码。你应该得到理想的结果。