我正在开发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如何做到这一点)或其他东西?提前感谢您的帮助。
答案 0 :(得分:1)
此处的问题与Chrome API无关。您有两个具有相同名称的函数注入页面。所以基本上会发生以下情况:
first.js
并执行done
功能second.js
并执行done
功能done
的second.js
覆盖了done
first.js
的定义
first.js
拨打done
时,它都会调用done
中定义的second.js
要查看相关证明,请将done
中的second.js
更改为done2
,然后执行代码。你应该得到理想的结果。