Viac volanie funkcie prehliadača chrome.runtime.sendMessage() s synchrónny správania

0

Otázka

Ja pripojenie content.js s background.js k tomu 2 rôzne úlohy: aplikovať miestneho HTML a načítanie údajov z inej webovej stránky. V súčasnosti, createContainer() začne po fetchweb() je hotovo a nie som si istý, prečo (prečo potrebujem createContainer() ak chcete spustiť prvý). Snažil som sa transformovať obe funkcie do Sľub, ale stále rovnaký výsledok

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

Najlepšiu odpoveď

1

Vaše dve sendMessages sú obe asynchrónne funkcie a--, ak nie je konkrétne riešenie s asynchrónnym kódom prostredníctvom volania, sľuby, alebo async/čakajú--nemyslím si, že existuje nejaký iný spôsob, ako zaručiť, ktorý rieši prvý.

Ak fetchWeb mali spustiť zakaždým, keď createContainer zašle správu, môžete pridať fetchWeb na sendMessage je spätný hovor (a následne ho odstrániť z vášho hlavného tela):

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

Ak fetchWeb by len niekedy spustí, môžete prejsť údaje do createContainer funkcia odpovede na túto 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
}

Ak existuje niečo iné sa deje v "//ďalší kód", ktorý potrebuje, aby sa stalo pred fetchWeb beží, bolo by to užitočné vidieť, že. Ale ak nie je kód asynchrónneho ako dobre, viem si predstaviť, že kód je už vykonávajúci prvý. To by mohlo byť všetko vykonané s sľubuje rovnako, ale sendMessage je už setup, aby dobre pracovať s volania. Z dokumentácie:

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

V iných jazykoch

Táto stránka je v iných jazykoch

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