De múltiples funciones de llamada chrome.en tiempo de ejecución.sendMessage() con sincrónico comportamiento

0

Pregunta

Me conecto content.js con background.js hacer 2 tareas diferentes: inyectar HTML local y obtener los datos de otra página web. En la actualidad, la createContainer() se inicia después de fetchweb() está hecho y no estoy seguro de por qué (necesito createContainer() para ejecutar la primera). Traté de transformar ambas funciones en la Promesa, pero sigue siendo el mismo resultado

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

Mejor respuesta

1

Sus dos sendMessages son tanto asincrónica funciones y, a menos de que trata específicamente con asincrónica de codificación a través de las devoluciones de llamada, promesas, o async/await-no creo que exista otra manera de garantizar que resuelve primero.

Si fetchWeb se debe ejecutar cada vez que después de createContainer envía su mensaje, usted puede agregar fetchWeb a sendMessage de devolución de llamada (y, a continuación, eliminarlo de tu cuerpo principal):

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

Si fetchWeb debe sólo a veces funcionan, podrías pasar los datos a la createContainer función de responder a esa pregunta:

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

Si hay algo más sucediendo en "//más código" que tiene que ocurrir antes de fetchWeb se ejecuta, sería de gran ayuda para ver que. Pero a menos que el código es asincrónica así, me imagino que el código ya está ejecutando en primer lugar. Todo esto podría ser hecho con promesas, pero sendMessage ya está configurado para trabajar bien con las devoluciones de llamada. A partir de la documentación:

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

En otros idiomas

Esta página está en otros idiomas

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