Połączenie wielu funkcji w chrome.runtime.SendMessage() z symultanicznym zachowaniem

0

Pytanie

Łączę content.js z background.js do wykonania 2 różnych zadań: wprowadź lokalny kod HTML i usuń dane z innej strony. Obecnie w createContainer() rozpoczyna się po fetchweb() się robi, i nie jestem pewien, dlaczego (muszę createContainer() aby uciec pierwszym). Próbowałem przekonwertować obie funkcje w Obietnicy, ale i tak wynik jest taki sam

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

Najlepsza odpowiedź

1

Twoje dwa posty wysyłki są asynchroniczne funkcje, i-jeśli tylko specjalnie nie zajmuje asynchroniczna kodowaniem za pomocą wywołań zwrotnych, obietnic lub asynchronicznego gotowości/uśpienia-nie sądzę, że istnieje jakiś inny sposób, aby zapewnić, że decyzja zostanie wykonana w pierwszej kolejności.

Jeśli fetchWeb musi działać za każdym razem po wysłaniu wiadomości createContainer, można dodać fetchWeb do oddzwonienia SendMessage (a następnie usunąć go z korpusu głównego):

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

Jeśli fetchWeb powinien być uruchamiany tylko czasami, może przekazać dane w funkcji createContainer, która odpowiada na to pytanie:

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

Jeśli w "//więcej kodu" dzieje się coś jeszcze, co powinno nastąpić przed uruchomieniem fetchWeb, warto byłoby to zobaczyć. Ale jeśli ten kod nie jest asynchroniczna, przypuszczam, że ten kod już działa pierwszy. Wszystko to można zrobić i za pomocą obietnic, ale SendMessage jest już skonfigurowany na dobrą pracę z obciążeniami połączeń. Z dokumentacji:

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

W innych językach

Ta strona jest w innych językach

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