google-chrome-extension
Message passant
Recherche…
Remarques
Documentation officielle
- Message passant
- Messagerie native
- API
chrome.runtime(la plupart des fonctions de messagerie et tous les événements de messagerie)
Envoyer une réponse de manière asynchrone
En essayant d'envoyer une réponse de manière asynchrone à partir chrome.runtime.onMessage rappel chrome.runtime.onMessage nous pourrions essayer ce mauvais code :
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);
},
});
});
Cependant, nous trouverions que les data ne sont jamais envoyées. Cela se produit parce que nous avons placé sendResponse dans un appel asynchrone ajax, lorsque la méthode de success est exécutée, le canal de message a été fermé.
La solution serait simple, à condition que nous retournions explicitement return true; à la fin du rappel, qui indique que nous souhaitons envoyer une réponse de manière asynchrone, le canal de messages restera ouvert à l'autre extrémité (appelant) jusqu'à sendResponse que sendResponse soit exécuté.
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
});
Bien sûr, cela s'applique également à un return explicite du rappel 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
});