J'essaye de passer des messages entre le script de contenu et l'extension
Voici ce que j'ai dans content-script
chrome.runtime.sendMessage({type: "getUrls"}, function(response) {
console.log(response)
});
Et dans le script d'arrière-plan que j'ai
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})
}
});
}
Maintenant, si j'envoie la réponse avant l'appel ajax dans la getUrls
fonction, la réponse est envoyée avec succès, mais dans la méthode de succès de l'appel ajax lorsque j'envoie la réponse, elle ne l'envoie pas, quand je vais au débogage, je peux voir que le port est nul dans le code de la sendResponse
fonction.
Réponses:
De la documentation pour
chrome.runtime.onMessage.addListener
:Il vous suffit donc d'ajouter
return true;
après l'appel àgetUrls
pour indiquer que vous appellerez la fonction de réponse de manière asynchrone.la source
<blink>
et<marquee>
balises quelque part sur la page.La réponse acceptée est correcte, je voulais juste ajouter un exemple de code qui simplifie cela. Le problème est que l'API (à mon avis) n'est pas bien conçue car elle nous oblige les développeurs à savoir si un message particulier sera traité de manière asynchrone ou non. Si vous gérez de nombreux messages différents, cela devient une tâche impossible car vous ne savez jamais si au fond d'une fonction une sendResponse transmise sera appelée async ou non. Considère ceci:
Comment puis-je savoir si au fond,
handleMethod1
l'appel sera asynchrone ou non? Comment quelqu'un qui modifie peut-ilhandleMethod1
savoir qu'il brisera un appelant en introduisant quelque chose d'async?Ma solution est la suivante:
Cela gère automatiquement la valeur de retour, quelle que soit la façon dont vous choisissez de gérer le message. Notez que cela suppose que vous n'oublierez jamais d'appeler la fonction de réponse. Notez également que le chrome aurait pu automatiser cela pour nous, je ne vois pas pourquoi ils ne l'ont pas fait.
la source
chrome.extension.onRequest
/ obsolèteschrome.exension.sendRequest
se comportent exactement comme vous le décrivez. Ces méthodes sont obsolètes car il s'avère que de nombreux développeurs d'extensions n'ont PAS fermé le port de message. L'API actuelle (exigeantreturn true
) est une meilleure conception, car échouer dur est mieux que de fuir silencieusement.return true;
. Cela n'empêche pas le nettoyage du port si l'appel est synchronisé, alors que les appels asynchrones sont toujours traités correctement. Le code de cette réponse introduit une complexité inutile sans avantage apparent.Vous pouvez utiliser ma bibliothèque https://github.com/lawlietmester/webextension pour que cela fonctionne à la fois dans Chrome et FF avec Firefox, sans rappel.
Votre code ressemblera à:
la source