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
});