Vários chamada de função para o google chrome.o tempo de execução.sendMessage() com comportamento síncrono

0

Pergunta

Eu ligar content.js com background.js para fazer 2 diferentes tarefas: injetar HTML local e obtenção de dados a partir de outra página da web. Atualmente, o createContainer() começa depois de fetchweb() está feito e eu não tenho certeza de por que (eu preciso createContainer() para executar o primeiro). Eu tentei transformar tanto em funções de Promessa, mas ainda o mesmo 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

Melhor resposta

1

Seus dois sendMessages são ambas funções assíncronas e, a menos que especificamente a lidar com assíncrona de codificação através de chamadas de retorno, promessas, ou async/await--eu não acho que há qualquer outra forma de garantir que resolve em primeiro lugar.

Se fetchWeb deve ser executado a cada hora após createContainer envia a sua mensagem, você pode adicionar fetchWeb para sendMessage de retorno de chamada (e, em seguida, removê-lo do seu corpo principal):

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

Se fetchWeb deve só às vezes, você pode passar dados para o createContainer de responder a esta pergunta:

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

Se há algo mais acontecendo no "//código mais" que precisa acontecer antes fetchWeb é executado, ele seria útil para ver isso. Mas, a menos que esse código é assíncrona, bem como, imagino que o código já está em execução em primeiro lugar. Isso tudo poderia ser feito com promessas de bem, mas sendMessage já está configurado para funcionar bem com as chamadas de retorno. Da documentação:

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

Em outros idiomas

Esta página está em outros idiomas

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