Расширение Chrome - передать результат функции из скрипта содержимого в popup.js

У меня есть расширение с popup.html, в котором есть popup.js. Я использую popup.js для вызова функции, расположенной в сценарии содержимого, с помощью метода chrome.tabs.sendMessage. Это нормально работает, но ..

Как мне вернуть значение функции в popup.js? Мне нужно также настроить слушателя на popup.js или как?

На моем popup.js есть:

chrome.tabs.sendMessage(tab.id, {
 expiryRequest: 'expiry '
}, function (response) {
if (response.refreshResponse === true) {
 console.log('Expiry taken');
} else {
 console.log('Expiry NOT taken');
}
});

Эта часть отлично работает ..

В моем сценарии содержимого я прочитал определенный div в переменный "результат". В конце я использовал скрипт функции над содержимым.

return result;

or

return true;

Ни один из них ничего не возвращает обратно tuo popup.js. Что мне нужно изменить, чтобы вернуться к работе со сценария содержимого на popup.js?


person user3647376    schedule 30.05.2014    source источник


Ответы (1)


Вы не должны return ваш результат, а должны отправить его обратно.

chrome.runtime.onMessage обратные вызовы принимают 3 параметра: сообщение, информацию об отправителе и обратный вызов sendResponse. .

Чтобы передать ответ обратно, необходимо вызвать sendResponse:

chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){
  if(message.ping) sendResponse({pong: true});
});

Однако есть еще одна хитрость. Слушатель событий должен либо ответить немедленно (т. Е. Синхронно, до выхода), либо сигнализировать, что он ответит позже. Это делается с помощью возвращаемого значения:

chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){
  if(message.ping) {
    chrome.storage.local.get("shouldReply", function(result){
      // This is asynchronous: by now the listener returned
      if(result.shouldReply) sendResponse({pong: true});
    });
  }
  return true; // Indicate that you will eventually call sendResponse
});    

Если вы этого не сделаете, ссылка sendResponse становится недействительной, когда слушатель завершает работу и отправляется неопределенный ответ.

Еще одно предостережение: звонить sendResponse не более одного раза; в противном случае будет сгенерирована ошибка.

person Xan    schedule 30.05.2014
comment
Спасибо за быстрый ответ, но я все еще в замешательстве .. Если я хочу отправить обратно содержимое переменной result, как мне это сделать? sendResponse ({результат: истина}); - person user3647376; 30.05.2014
comment
Сообщение может быть любым. Вы можете просто вернуть саму переменную: sendResponse(result) или обернуть ее в объект: sendResponse({refreshResponse: result}) (который будет соответствовать вашему другому коду) - person Xan; 30.05.2014
comment
Большое спасибо @Xan. Это был ответ, который я искал, особенно последняя часть о возвращении правды. Я был очень запутан тем, почему мой слушатель вернулся рано, но благодаря вашему ответу теперь все ясно :) - person Sanjay; 01.10.2018
comment
О, это было интересно и полезно. Спасибо :) - person jacobkim; 26.06.2021