Extension Chome: envoi de données chrome.storage depuis un script d'arrière-plan vers popup / contentscript

Comme décrit dans le titre, j'essaie d'écrire un script en arrière-plan qui écoutera les demandes de chargement à partir de popup.js ou de contentscript.js. Lorsqu'il reçoit une charge, il obtient le contenu de chrome.storage.local, effectue un peu de traitement des données (pour la boucle) et l'envoie au demandeur.

Le problème actuel est que mon code reçoit la demande, mais ne parvient pas à renvoyer les données. Mon code est répertorié ci-dessous:

Popup.js:

chrome.runtime.sendMessage({greeting: "Load"}, function(response) { console.log(response); } 

Background.js:

 chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { if(request.greeting=='Load') { chrome.storage.local.get(null,function(storeObject){ var newList=[]; //Perform some dataprocessing to store part of storeObject into newList sendResponse(newList); }); } }); 

Je pense que le problème est lié à la portée, car après le débogage, il semble que sendResponse essaie d'envoyer depuis chrome.storage au lieu de background.js. De plus, si j'envoie le message à l'extérieur (avant / après), le rappel de chrome.storage.local, popup.js reçoit le message. Bien sûr, je suis assez perdu pour faire ce travail en train de travailler et j'apprécierais toute aide.

Selon les docs sur `chrome.runtime.onMessage :

SendResponse (fonction)
[…] Cette fonction devient invalide lorsque l'auditeur d'événement retourne, à moins que vous ne renvoyiez true de l'auditeur d'événement pour indiquer que vous souhaitez envoyer une réponse de manière asynchrone (cela permettra de garder le canal de message ouvert à l'autre extrémité jusqu'à ce que SendResponse soit appelée).

Puisque sendResponse s'appelle de manière asynchrone dans le chrome.storage.local.get() de chrome.storage.local.get() , vous devez renvoyer true de l'auditeur onMessage pour éviter que la fonction ne soit invalidée.

 chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { if (request.greeting === 'Load') { chrome.storage.local.get(null, function(storeObject) { ... sendResponse(newList); }); return true; // <-- I intend to call `sendResponse` later } return false; // <-- I do NOT intend to call `sendResponse` });