Conecto content.js con background.js para realizar 2 tareas diferentes: inyectar HTML local y obtener datos de otra página web. Actualmente, createContainer() comienza después de que se realiza fetchweb() y no estoy seguro de por qué (necesito que createContainer() se ejecute primero). Traté de transformar ambas funciones en Promise pero sigue siendo el mismo resultado.
Contenido.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()fondo.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; } });Sus dos sendMessages son funciones asíncronas y, a menos que se trate específicamente de codificación asíncrona a través de devoluciones de llamada, promesas o asíncrono/espera, no creo que haya otra forma de garantizar cuál se resuelve primero.
Si fetchWeb debe ejecutarse cada vez que createContainer envía su mensaje, puede agregar fetchWeb a la devolución de llamada de sendMessage (y luego eliminarlo de su cuerpo principal):
...chrome.runtime.sendMessage({ cmd: "read_cont1" }, function (html) { $("#container1").html(html); fetchWeb(); });...Si fetchWeb solo debe ejecutarse algunas veces, podría pasar datos a la función createContainer respondiendo 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 está sucediendo algo más en "//más código" que debe suceder antes de que se ejecute fetchWeb, sería útil verlo. Pero a menos que ese código también sea asíncrono, imagino que el código ya se está ejecutando primero. Todo esto también podría hacerse con promesas, pero sendMessage ya está configurado para funcionar bien con devoluciones de llamada. De la documentación :
chrome.runtime.sendMessage( extensionId?: string, message: any, options?: object, responseCallback?: function, )