Chrome Расширение: дождаться ответа sendMessage перед выполнением другой функции? - PullRequest
0 голосов
/ 13 января 2020

У меня есть две функции в моем расширении контекстного меню. Я должен щелкнуть один, чтобы отправить сообщение в скрипт содержимого, а затем мне нужно щелкнуть другой, потому что функции sendMessage устанавливают переменные в моем фоновом скрипте. То, что я пытаюсь сделать, это просто сделать их одной кнопкой и сначала вернуть функцию sendMessage, а затем другая функция может это сделать, потому что теперь переменные установлены. Вот что я имею в виду:

В фоновом режиме. js

chrome.contextMenus.create({
    title: "Send Message",
    contexts: ["all"],
    onclick: sendMessage
});

chrome.contextMenus.create({
    title: "Get All",
    contexts: ["all"],
    onclick: getAll
});

var title;
var link;
var bp;
var imgSrc;

function sendMessage() {
    chrome.tabs.query({
        active: true,
        currentWindow: true
    }, function (tabs) {
        chrome.tabs.sendMessage(tabs[0].id, {
            req: "request"
        }, function (response) {
            console.log("responded");
            title = response.title;
            link = response.link;
            bp = response.bp;
            imgSrc = response.imgSrc;
        });
    });
};

function getAll(info) {
    var el = document.createElement('textarea');
    var all =
        "<tr><td><img src=\"" + imgSrc + "\"></td>\n\
        <td><span class =\"productTitle\">" + title + "</span></td>\n\
        <td>" + bp.split("\n").slice(0, 5).map(i => '<span class="bulletPoints"><i class="fas fa-check" style="color: #5cb85c"></i> ' + i.substring(0, 90) + "...</span>").join("\n") + "</td>\n\
        <td>[boombox_button tag_type=\"a\" type=\"success\" url=\"" + info.pageUrl.substring(0, link.indexOf("dp") + 14) + "\" target=\"blank\"]Check Price[/boombox_button]</td></tr>";
    el.value = all;
    document.body.appendChild(el);
    el.select();
    document.execCommand('copy');
}

В содержании. js

chrome.runtime.onMessage.addListener(
    function (request, sender, sendResponse) {
    if (request.req == "request")
        sendResponse({
            title: document.getElementById("productTitle").innerText,
            link: window.location.href,
            bp: document.getElementById("feature-bullets").innerText,
            imgSrc: document.getElementById("imgTagWrapperId").getElementsByTagName('img')[0].src.toString().replace(/_.*_/, '_SX250_')
        });
    return true;
});

Я довольно новичок в Javascript, и мне было непросто пробовать разные вещи, такие как обратные вызовы, обещания, setTimeout, не уверен, правильно ли я их настраиваю, но я надеялся, что кто-то может указать мне правильное направление.

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