1

Avoir un problème en passant des messages en utilisant des scripts de contenu dans l'extension Google Chrome dev Ma structure de code ressemble à ceci:développement Extension Chrome: Message Passing Problème

popup.html:

var oList; 
function getHTML() 
{ 
    chrome.tabs.getSelected(null, function(tab) { 
    chrome.tabs.sendRequest(tab.id, {action:"getHTML"}, function handler(response) { 
     oList = response.dom; 
    }); 
    }); 

    alert("oList = "+oList); 
} 

et mon contenu Script ressemble à ceci:

chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) { 
    if(request.action == "getHTML"){ 
    sendResponse({dom: document.getElementsByTagName("HTML").length}); 
    } 
    }); 

Quand je déboguer mon code en mettant un point d'arrêt à « oList = response.dom; » dans mon popup.html, j'obtiens la bonne valeur du script de contenu. Mais lors de l'exécution de l'extension, le code "alert("oList = "+oList);" du popup.html semble être en cours d'exécution avant d'aller au serveur .. Et donc, sa valeur est n'étant pas réglée .. Quelqu'un peut-il me dire si je me trompe quelque part ?

+0

Son comportement vraiment bizarre .. Si je fais un « Vérifiez Popup » sans points d'arrêt, son fonctionnement .. Si je viens d'exécuter clairement, il ne fonctionne pas! J'ai ajouté console.logs() à l'intérieur de la réponse et je vois que ça ne s'exécute pas. Mais quand je débogue, le code entre en jeu .. Je suis capable de voir les logs dans la console et m également en mesure d'obtenir les alertes. Pourquoi est-ce heureux? – sharath

Répondre

5

La plupart des méthodes de l'API Chrome sont asynchrones. Cela signifie que lorsque vous les appelez, le script n'attend pas leur réponse et continue simplement à s'exécuter. Si vous voulez exécuter quelque chose sur la réponse que vous devez le mettre dans la fonction de rappel:

chrome.tabs.getSelected(null, function(tab) { 
chrome.tabs.sendRequest(tab.id, {action:"getHTML"}, function handler(response) { 
    oList = response.dom; 
    alert("oList = "+oList); 
}); 
}); 
+0

Merci .. Mais c'est ce que je fais bien? Mon 'sendRequest' a le code 'oList = response.dom;' ce qui devrait définir la valeur à oList. Ceci est mis en place lors du débogage, mais pas lors de l'exécution :( – sharath

+0

J'ajoute un console.log ("oList =" + oList) ;. Mais je vois le résultat dans la console seulement quand je débogue .. Pas quand j'exécute :( – sharath

+1

@paypalcomp Ce n'est pas ce que vous faites.Votre tâche ne se produit pas avant l'affichage.Imaginez que vous avez une très grande quantité de données à transférer et cela prendrait 1 heure.Votre code s'exécuterait dans un tel ordre: 'var oList ; 'immédiatement suivi de' alert (oList); '(il n'attend pas le chargement des données), puis 1 heure plus tard:' oList = response.dom; '. Maintenant, la quantité de données est plus petite donc il suffit de quelques millisecondes pour le rappel de se déclencher, mais il arrive encore quelques millisecondes plus tard que votre alerte – serg

Questions connexes