Вызов нескольких функций в chrome.runtime.SendMessage() с синхронным поведением

0

Вопрос

Я подключаюсь content.js с background.js для выполнения 2 различных задач: введите локальный HTML-код и извлеките данные с другой веб-страницы. В настоящее время в createContainer() начинается после fetchweb() делается, и я не уверен, почему (мне нужно createContainer() чтобы бежать первым). Я попытался преобразовать обе функции в Обещание, но все равно результат тот же

Content.js

function createContainer1() {
    // call html file container
    chrome.runtime.sendMessage({ cmd: "read_cont1" }, function (html) {
        $("#container1").html(html);
    });
    // more code
}
    
function fetchWeb() {
    chrome.runtime.sendMessage(
        { cmd: "send_url", url: window.location.href},
        function (response) {
            console.log(JSON.stringify(response));
        }
    );
}

createContainer1()
fetchWeb()

background.js

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
    if (request.cmd == "read_cont1") {
        $.ajax({
            url: chrome.extension.getURL("container1.html"),
            dataType: "html",
            success: sendResponse,
        });
        return true;
    } else if (request.cmd == "send_url") {
        sendResponse({ review_url: fetchData(request.url) });
        return true;    
    }
});
google-chrome-extension javascript
2021-11-18 10:43:15
1

Лучший ответ

1

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

Если fetchWeb должен запускаться каждый раз после отправки сообщения createContainer, вы можете добавить fetchWeb для обратного вызова SendMessage (а затем удалить его из основного корпуса):

...chrome.runtime.sendMessage({ cmd: "read_cont1" }, function (html) {
    $("#container1").html(html);
    fetchWeb();
});...

Если fetchWeb должен запускаться только иногда, вы можете передать данные в функцию createContainer, отвечающую на этот вопрос:

function createContainer1(executeFetchWeb) {
    // call html file container
    chrome.runtime.sendMessage({ cmd: "read_cont1" }, function (html) {
        $("#container1").html(html);
        if (executeFetchWeb) {fetchWeb()}
    });
    // more code
}

Если в "//больше кода" происходит что-то еще, что должно произойти до запуска fetchWeb, было бы полезно это увидеть. Но если этот код также не является асинхронным, я полагаю, что этот код уже выполняется первым. Все это можно было бы сделать и с помощью обещаний, но SendMessage уже настроен на хорошую работу с обратными вызовами. Из документации:

chrome.runtime.sendMessage(
  extensionId?: string,
  message: any,
  options?: object,
  responseCallback?: function,
)
2021-11-21 02:51:53

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................