Mai multe apel de funcție pentru chrome.runtime.sendMessage() cu sincron comportamentul

0

Problema

Am conecta content.js cu background.js pentru a face 2 sarcini diferite: inject HTML locale și a prelua datele dintr-o altă pagină web. În prezent, createContainer() începe după fetchweb() este de făcut și eu nu sunt sigur de ce (am nevoie de createContainer() pentru a rula în primul rând). Am încercat să transforme ambele funcții în Promit dar tot acelasi rezultat

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

Cel mai bun răspuns

1

Două sendMessages sunt atât asincron funcții și ... dacă nu se ocupă în mod special cu asincron de codificare prin callback, promisiuni, sau asincron/așteaptă ... nu cred că există vreo altă cale de a garanta care rezolvă mai întâi.

Dacă fetchWeb ar trebui să ruleze de fiecare dată după createContainer trimite mesaj, ai putea adăuga fetchWeb să sendMessage e callback (și apoi scoateți-l de pe corpul principal):

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

Dacă fetchWeb ar trebui doar rula, uneori, ai putea trece datele în createContainer funcția de a răspunde la această întrebare:

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

Dacă este ceva ce se întâmplă în "//mai mult de cod" care trebuie să se întâmple înainte de fetchWeb ruleaza, ar fi util să vezi asta. Dar cu excepția cazului în care codul este asincron, precum și, îmi imaginez că codul este deja de executare în primul rând. Acest lucru ar putea fi făcut cu promisiuni la fel de bine, dar sendMessage este deja de configurare pentru a lucra bine cu callback. Din documentația:

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

În alte limbi

Această pagină este în alte limbi

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