He leído la plétora de foros y enlaces de reddit y stackoverflow QnA y no responde la pregunta ni la explica de manera clara. He estado en esto durante 2 o 3 días ahora solo en este asíncrono en espera de promesas bs.
Tengo una función emergente asíncrona que llama a chrome.tabs.sendMessage , como puede ver a continuación, es muy, muy básica. Envío un mensaje, espero una respuesta. Viola, listo.
Mi comprensión de una función de devolución de llamada me dice que chrome.tabs.sendMessage ESPERARÁ una respuesta LUEGO ejecutará la función, pero ¿qué sucede si la función se ejecuta de todos modos? y no puedo darle sentido. Simplemente se ejecuta y recibe lo antes posible sin esperar a que finalice el script de contenido. ¿Cuál es el punto de una función de devolución de llamada entonces?
Intenté agregar esperar antes de enviar y esperar en la función de devolución de llamada y de cualquier manera posible, pero NO funciona. no lo entiendo El programa simplemente se ejecuta sin esperar.
He leído que esto no funciona. y esto no tiene sentido. Las promesas esperan un mensaje "completo" y de alguna manera eso lo hace esperar. ¿Pero la función de devolución de llamada tabs.message también ESPERA una respuesta pero aún se ejecuta de todos modos y no espera nada?
document.addEventListener('DOMContentLoaded', async function() { console.log('got tabs id'); tab = await getCurrentTab(); console.log('Active tab ' + tab.id); console.log('Sending Message to Content'); chrome.tabs.sendMessage(tab.id, {action: "getDOM"},function (ret) { console.log('Receiving Message from Content'); try { if (!ret.incident.length) return; globalThis.response = ret; processResponse(response); } catch(err) { console.log('doing nothing, bad return data') window.close; return; } }); return; });OP obviamente está muy confundido. devolución de llamada, asíncrono/espera, las promesas son lo mismo pero escrito de manera diferente. A continuación se muestra el código actualizado que usa solo promesas y devoluciones de llamada cuando es absolutamente necesario. En este caso, tabs.sendMessage de Chrome no devuelve una promesa como lo hacen en Firefox. Por lo tanto, debe usar el formulario de devolución de llamada. El content_script en este caso hace un tiempo de espera con sendResponse y funciona bien.
document.addEventListener('DOMContentLoaded', function() { console.log('got tabs id'); let queryOptions = {active: true, currentWindow: true}; chrome.tabs.query(queryOptions) .then((tabs) => { chrome.tabs.sendMessage(tabs[0].id, {action: "getDOM"}, (response) => { console.log(response); // processResponse(response); }); }) .catch((err) => { console.log(err); window.close(); return; }); });