我正在开发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。您在页面上注入了两个具有相同名称的函数。因此,基本上会发生以下情况:
first.js
并执行done
功能second.js
并执行done
功能done
从second.js
覆盖定义的运用done
从first.js
first.js
调用时done
,都会调用done
中定义的second.js
要看到证明了这一点,改变done
在second.js
给done2
然后执行代码。您应该得到预期的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句