Я разрабатываю расширение chrome, и после того, как некоторые дополнительные скрипты почти завершены, я столкнулся с проблемой обмена сообщениями. Я написал какой-то тестовый код и заметил, что в то время, слушатель onMessage может обрабатывать сообщение только из одного скрипта. Вот тестирование кода:Очередь сообщений расширенного расширения Chrome
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, как это сделать) или smth else? Заранее благодарю за любую помощь.
Благодарю вас, вы правы! Это способ разделения пространств имен? –