Я получаю сообщение от одного сценария расширения к другому, могу предупредить () сообщение, но не могу присвоить его какой-либо переменной - PullRequest
0 голосов
/ 13 февраля 2019

Я отправляю строковое сообщение из background.js в popup.js.Я получаю сообщение в popup.js, но не могу им манипулировать.Я могу просмотреть его, если alert (), или если я назначил его innerHTML элемента popup.html, но я не могу назначить его никаким переменным в popup.js, чтобы я мог изменить его и использовать.

Я пробовал обычное присваивание, я пытался с помощью substring () скопировать сообщение в другую переменную

Здесь у меня есть фрагмент background.js, который отправляет сообщение в popup.js.myString представляет собой строку:

chrome.runtime.sendMessage({
    action: "getSource",
    source: myString
});

Вот фрагмент popup.js, который получает сообщение после выполнения background.js, работает приведенный ниже код, отображает строку в popup.html:

chrome.runtime.onMessage.addListener(function(request, sender) {
  if (request.action == "getSource") {
container.innerHTML = request.source;}})

Это также работает:

chrome.runtime.onMessage.addListener(function(request, sender) {
  if (request.action == "getSource") {
alert(request.source);}})

Но когда я пытаюсь присвоить его переменной, я ничего не получаю (testString все еще пуст):

var testString = '';

chrome.runtime.onMessage.addListener(function(request, sender) {
  if (request.action == "getSource") {
testString = request.source;}})

ЕслиЯ присваиваю значение testString вне chrome.runtime.onMessage.addListener (...), назначение работает просто отлично, testString в конечном итоге становится "abcde":

var testString = '';

chrome.runtime.onMessage.addListener(function(request, sender) {
  if (request.action == "getSource") {
console.log("do nothing")}});

testString = "abcde";

Я хочу получить содержимоезапроса. источник в переменной, чтобы я мог управлять им.

Спасибо.

1 Ответ

0 голосов
/ 14 февраля 2019

chrome.runtime.onMessage.addListener получает обратный вызов в качестве параметра, и его возвращаемое значение не поступает синхронно.В то время, когда вы получили сообщение из фона, переменная testString может быть уже присвоена "abcde" или любому другому значению, которое вы пытаетесь присвоить ей после функции addListener.

Вы должны вызватьдругая функция (внутри обратного вызова addListener), которая передает testString в качестве параметра:

var testString = '';

function onMessageReceived (source)  {
   testString = source
   // do whatever you want with the value
}

chrome.runtime.onMessage.addListener(function (request, sender) {
  if (request.action === 'getSource') {
     onMessageReceived(request.source)
  }
})

Другой вариант - обернуть весь chrome.runtime.onMessage.addListener внутри Обещания:

function onMessageReceived (source) {
  return new Promise(function (resolve, reject) {
    chrome.runtime.onMessage.addListener(function (request, sender) {
      if (request.action === 'getSource') {
         resolve(request.source)
      }

      // don't forget to reject the Promise if some condition is not satisfied
  })
}

onMessageReceive().then(function (source) {
  // variable source contains request.source value
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...