Chrome扩展程序消息队列

丹尼斯·西维杜诺维奇(Denis Svidunovich)

我正在开发chrome扩展程序,并且在完成一些其他脚本之后,我遇到了消息传递问题。我编写了某种测试代码,并注意到,一次onMessage侦听器只能处理来自一个脚本的消息。这是测试代码:

background.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'});

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

first.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();

second.js

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
...

但它是:

first
second
second
second
second
second
...

那就是说我只能及时处理一条消息。而且我不知道如何解决我的问题,也许是诸如消息传递队列(idk如何做到这一点)之类的东西?在此先感谢您的帮助。

先验的

这里的问题不在于Chrome API。您在页面上注入了两个具有相同名称的函数。因此,基本上会发生以下情况:

  1. 您注入first.js并执行done功能
  2. 您注入second.js并执行done功能
  3. donesecond.js覆盖定义的运用donefirst.js
  4. 每次first.js调用时done,都会调用done中定义的second.js

要看到证明了这一点,改变donesecond.jsdone2然后执行代码。您应该得到预期的结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Chrome扩展程序消息传递

Chrome扩展程序本机消息传递同步

用户之间的Chrome扩展程序消息

消息队列或调度程序

使用消息队列扩展WebSockets

Chrome扩展程序-具有多个端口的消息传递

Chrome扩展程序消息传递:未发送响应

Chrome扩展程序消息未发送响应(未定义)

在Chrome扩展程序后台页面之间无法正确传递消息

从已加载的iframe将消息发送回Chrome扩展程序

Chrome扩展程序消息从弹出窗口传递到内容

如何使用Chrome扩展程序分发本机消息传递主机

Chrome扩展程序消息传递-如何传递HTML

使用Chrome扩展程序中传递的消息处理keyup事件

如何从Chrome扩展程序向本机应用发送消息?

从Chrome扩展程序中的内容脚本传递消息

Google Appscript Web App 从 Chrome 扩展程序接收消息

消息队列应用程序

Chrome 扩展异步消息传递

Chrome扩展程序选项

Chrome扩展程序-通知

Chrome扩展程序的指标

Chrome扩展程序CaptureStream

chrome扩展程序中的内容脚本和背景页面之间的消息传递无法正常工作

在Chrome扩展程序的背景页面的onClick事件上将消息发送到内容脚本

Chrome扩展程序:消息传递(将DOM发送到popup.js)返回“空”

如何使用Chrome扩展程序接收来自网页onClick事件的消息?

Chrome 扩展程序 - 使用消息传递的后台页面表单提交。表单只提交一次

在内容和背景之间传递的Chrome扩展程序消息不起作用