Как вернуть сообщение обратно из скрипта контента после сообщения из всплывающего окна? - PullRequest
0 голосов
/ 03 мая 2020

Я отправляю сообщение в скрипт контента в расширении браузера, которое я создаю. Затем мне нужно иметь значение, которое извлекает скрипт контента, отправленный обратно во всплывающее окно. Я знаю, что скрипт содержимого может найти значение, которое я запрашиваю, поскольку он печатает, когда я console.log значение. Однако я не могу заставить его вернуть это значение.

Основные настройки c, которые у меня есть для кода, следующие:

// popup.js
valueOnWebpage = browser.tabs.query({active: true, currentWindow: true})
        .then(updateLabelInPopup)
        .catch(printError);

function updateLabelInPopup(tabs) {
browser.tabs.sendMessage(tabs[0].id, {command: "getValueFromWebpage"})
            .then(function (result) {
                console.log("Result: " + result); // this is logging `"Result: undefined"`
                document.getElementById("id-of-element-in-popup").innerHTML = result;
            }).catch(function (err) {
                console.log("ERROR: ", err);
            });

}
// content_script.js
function getValueFromWebpage() {
    return document.getElementById("id-of-element-value-i-want").innerText;
}

browser.runtime.onMessage.addListener((message) => {
    if (message.command === "getValueFromWebpage") {
        valueFromPage = getValueFromWebpage();
        console.log("Ran by message listener ", valueFromPage); // This is in fact logging what I want
        return valueFromPage; // I want this so that I can do something with it in the popup
    } else {
        return "Not a recognized command";
    }
});

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Вам нужно вернуть обещание от слушателя, а не примитивное значение, например:

// content_script.js
browser.runtime.onMessage.addListener((message) => {
    if (message.command === "getValueFromWebpage") {
        valueFromPage = getValueFromWebpage();
        return Promise.resolve(valueFromPage);
    } else {
        return "Not a recognized command";
    }
});

Promise.resolve() упаковывает данное значение как обещание, поэтому оно помогает вам вернуть любой примитив значение синхронно от слушателя.

0 голосов
/ 03 мая 2020

Я возвращал значение как результат функции обратного вызова. Это не возвращается во всплывающий скрипт! Duh! Вы должны передать его как сообщение во всплывающий скрипт. По какой-то причине я подумал, что из скрипта содержимого во всплывающее окно нельзя передавать сообщения.

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