Plusieurs appel de fonction pour chrome.moment de l'exécution.sendMessage() synchrone comportement

0

La question

- Je me connecter content.js avec background.js faire 2 tâches différentes: injecter de l'HTML en local et extraire des données à partir d'une autre page web. Actuellement, l' createContainer() commence après fetchweb() est fait et je ne sais pas pourquoi (j'ai besoin de createContainer() à exécuter en premier). J'ai essayé de transformer à la fois les fonctions dans la Promesse, mais toujours le même résultat

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

La meilleure réponse

1

Vos deux sendMessages sont à la fois des fonctions asynchrones et-à moins que traitant spécifiquement de l'asynchrone par un codage des rappels, des promesses, ou async/await--je ne pense pas qu'il y ait une autre façon de garantir ce qui résout en premier.

Si fetchWeb doit s'exécuter chaque fois après createContainer envoie son message, vous pouvez ajouter fetchWeb sendMessage rappel (et puis le supprimer de votre corps principal):

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

Si fetchWeb ne devrait parfois, vous pourriez passer des données dans le createContainer la fonction répondre à cette question:

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

Si il y a autre chose qui se passe dans "//en savoir plus", qui doit se produire avant fetchWeb s'exécute, il serait utile de voir ça. Mais, à moins que le code est asynchrone ainsi, j'imagine que le code est déjà en cours d'exécution en premier. Cela pourrait être fait avec des promesses, mais sendMessage est déjà configuré pour fonctionner avec les rappels. À partir de la documentation:

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

Dans d'autres langues

Cette page est dans d'autres langues

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