Vícenásobné volání funkce se do prohlížeče chrome.runtime.sendMessage() s synchronní chování

0

Otázka

Jsem se připojit content.js s background.js udělat 2 různé úkoly: inject místní HTML a načítat data z jiné webové stránky. V současné době, createContainer() začíná po fetchweb() je hotovo a já nejsem jistý, proč (já třeba createContainer() spustit jako první). Snažil jsem se transformovat do funkce Slib, ale stále stejný výsledek

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

Nejlepší odpověď

1

Vaše dva sendMessages jsou oba asynchronní funkce a-pokud není výslovně zabývá asynchronní kódování prostřednictvím zpětných volání, sliby, nebo async/await--nemyslím si, že je jiný způsob, jak zaručit, které řeší první.

Pokud fetchWeb by měla spustit pokaždé, když se po createContainer pošle svou zprávu, můžete přidat fetchWeb na sendMessage je zpětné volání (a pak ji vyjměte z hlavní tělo):

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

Pokud fetchWeb by měl jen občas spustit, můžete přenést data do createContainer funkce odpovědi na tuto otázku:

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

Pokud tam je něco jiného se děje v "//další kód", který se musí stát, než fetchWeb běží, to by bylo užitečné vidět, že. Ale pokud ten kód je asynchronní, stejně jsem si představit, že kód je již provádění první. To vše by mohlo být provedeno s příslibem stejně, ale sendMessage je již nastavení, aby dobře pracovat s zpětná volání. Z dokumentace:

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

V jiných jazycích

Tato stránka je v jiných jazycích

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