Estoy intentando pasar mensajes entre el script de contenido y la extensión
Esto es lo que tengo en content-script
chrome.runtime.sendMessage({type: "getUrls"}, function(response) {
console.log(response)
});
Y en el guión de fondo tengo
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.type == "getUrls"){
getUrls(request, sender, sendResponse)
}
});
function getUrls(request, sender, sendResponse){
var resp = sendResponse;
$.ajax({
url: "http://localhost:3000/urls",
method: 'GET',
success: function(d){
resp({urls: d})
}
});
}
Ahora, si envío la respuesta antes de la llamada ajax en la getUrls
función, la respuesta se envía con éxito, pero en el método de éxito de la llamada ajax cuando envío la respuesta no la envía, cuando entro en la depuración puedo ver que el puerto es nulo dentro del código para la sendResponse
función.
Respuestas:
De la documentación para
chrome.runtime.onMessage.addListener
:Por lo tanto, solo necesita agregar
return true;
después de la llamada agetUrls
para indicar que llamará a la función de respuesta de forma asincrónica.fuente
<blink>
y<marquee>
etiquetas en algún lugar de la página.La respuesta aceptada es correcta, solo quería agregar un código de muestra que simplifique esto. El problema es que la API (en mi opinión) no está bien diseñada porque nos obliga a los desarrolladores a saber si un mensaje en particular se manejará de forma asíncrona o no. Si maneja muchos mensajes diferentes, esto se convierte en una tarea imposible porque nunca se sabe si en el fondo de alguna función un sendResponse pasado se llamará asíncrono o no. Considera esto:
¿Cómo puedo saber si en
handleMethod1
el fondo la llamada será asíncrona o no? ¿Cómo puede alguien que modificahandleMethod1
saber que interrumpirá una llamada introduciendo algo asíncrono?Mi solución es esta:
Esto maneja automáticamente el valor de retorno, independientemente de cómo elija manejar el mensaje. Tenga en cuenta que esto supone que nunca olvida llamar a la función de respuesta. También tenga en cuenta que el cromo podría haber automatizado esto para nosotros, no veo por qué no lo hicieron.
fuente
chrome.extension.onRequest
/ obsoletos sechrome.exension.sendRequest
comportan exactamente como usted describe. Estos métodos están en desuso porque resulta que muchos desarrolladores de extensiones NO cerraron el puerto de mensajes. La API actual (que requierereturn true
) es un mejor diseño, porque fallar mucho es mejor que tener una fuga silenciosa.return true;
. No evita que se limpie el puerto si la llamada está sincronizada, mientras que las llamadas asíncronas todavía se procesan correctamente. El código en esta respuesta introduce una complejidad innecesaria sin beneficio aparente.Puede usar mi biblioteca https://github.com/lawlietmester/webextension para hacer que esto funcione tanto en Chrome como en FF con Firefox sin devoluciones de llamada.
Su código se verá así:
fuente