Più la funzione di chiamata a chrome.runtime.sendMessage() sincrono comportamento

0

Domanda

Mi collego content.js con background.js per fare 2 diversi compiti: iniettare HTML locale e recuperare i dati da un'altra pagina web. Attualmente, l' createContainer() inizia dopo fetchweb() è fatto e non so perché (ho bisogno createContainer() per eseguire prima). Ho provato a trasformare entrambe le funzioni in Promessa, ma ancora lo stesso risultato

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

Migliore risposta

1

I tuoi due sendMessages sono entrambe funzioni asincrone e-a meno che si occupano di asincrono codifica tramite callback, promesse, o async/await--non credo ci sia altro modo per garantire che si risolve prima.

Se fetchWeb deve essere eseguito ogni volta dopo createContainer invia il suo messaggio, si potrebbe aggiungere fetchWeb sendMessage richiamata (e quindi rimuoverlo dal corpo principale):

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

Se fetchWeb solo a volte eseguire, si potrebbe passare dati al createContainer funzione di rispondere a questa domanda:

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

Se c'è qualcosa che accade in "//altro codice che deve accadere prima che fetchWeb corre, sarebbe utile vedere che. Ma, a meno che il codice è asincrona così, immagino che il codice è già in esecuzione prima. Questo potrebbe essere fatto con promesse, ma sendMessage è già configurato per funzionare bene con le richiamate. Dalla documentazione:

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

In altre lingue

Questa pagina è in altre lingue

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