2016-06-24 3 views
0

Я разрабатываю расширение 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? Заранее благодарю за любую помощь.

ответ

1

Проблема здесь не в API Chrome. У вас есть две функции с одним и тем же именем, введенным на страницу. Поэтому в основном происходит следующее:

  1. Вы впрыснуть first.js и выполняет done функцию
  2. Вы впрыснуть second.js и выполняет done функция
  3. done из second.js перезаписывает дефиниция из done от first.js
  4. Каждый раз first.js звонки done он будет называть done, как определено в second.js

Чтобы увидеть доказательство этого, изменение done в second.js к done2, а затем выполнить код. Вы должны получить желаемые результаты.

+0

Благодарю вас, вы правы! Это способ разделения пространств имен? –

Смежные вопросы