google-chrome-extension
Paso de mensajes
Buscar..
Observaciones
Documentacion oficial
- Paso de mensajes
- Mensajería nativa
- API
chrome.runtime
(la mayoría de las funciones de mensajería y todos los eventos de mensajería)
Enviar una respuesta de forma asíncrona.
En el intento de enviar una respuesta de forma asincrónica desde la chrome.runtime.onMessage
llamada chrome.runtime.onMessage
podemos intentar este código incorrecto :
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
$.ajax({
url: 'https://www.google.com',
method: 'GET',
success: function(data) {
// data won't be sent
sendResponse(data);
},
});
});
Sin embargo, encontraríamos que los data
nunca se envían. Esto sucede porque hemos puesto sendResponse
dentro de una llamada ajax asíncrona, cuando se ejecuta el método de success
, el canal de mensaje se ha cerrado.
La solución sería simple, siempre y cuando devolvamos explícitamente return true;
al final de la devolución de llamada, lo que indica que deseamos enviar una respuesta de forma asíncrona, por lo que el canal de mensajes se mantendrá abierto al otro extremo (llamante) hasta que se ejecute sendResponse
.
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
$.ajax({
url: 'https://www.google.com',
method: 'GET',
success: function(data) {
// data would be sent successfully
sendResponse(data);
},
});
return true; // keeps the message channel open until `sendResponse` is executed
});
Por supuesto, también se aplica a un return
explícito de la devolución de llamada de onMessage:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.action == 'get') {
$.ajax({
url: 'https://www.google.com',
method: 'GET',
success: function(data) {
// data would be sent successfully
sendResponse(data);
},
});
return true; // keeps the message channel open until `sendResponse` is executed
}
// do something synchronous, use sendResponse
// normal exit closes the message channel
});