2012-12-30 4 views
1

Je travaille sur une extension chrome qui extrait des méta-données. Le code qui analyse les métadonnées est contenu dans un script de contenu. Background.js et content.js communiquent via une requête et une réponse sendMessage. Je rencontre un problème avec la nature asynchrone de la requête sendMessage et je ne suis pas sûr de savoir comment y remédier (même après avoir lu une longue liste de discussions sur le problème). Tout conseil ou direction serait apprécié. Je soupçonne que je ne comprends pas comment les transformer en rappels.Extension Chrome: traitement de sendMessage asynchrone.

background.js:

function onContextClick(info, tab) {  
    if(info["selectionText"]){ 
    var x = getMeta(tab); 
    //do stuff with x  
    } 
} 

function getMeta (tab) { 
chrome.tabs.sendMessage(tab.id, {fetchTag: "meta,name,author,content"}, function(response) { 
    //alert(response.data); 
    //one thing I tired was to put my "do stuff" embedded here, but that didn't work either   
    return response.data; 
    }); 
} 

var menu_id = chrome.contextMenus.create({"title": "Get Meta", "contexts":["selection"], "onclick": onContextClick}); 

content.js:

function fetchTag(string) { 
    var param = string.split(","); 
    return $(param[0] + "["+param[1]+ "=\"" + param[2] + "\"]").attr(param[3]); 
    } 

chrome.extension.onMessage.addListener(
    function(request, sender, sendResponse) { 
    if (request.fetchTag.length > 0)   
    sendResponse({data: fetchTag(request.fetchTag)}); 
    }); 
+0

double possible de [Comment retourner la réponse d'un appel asynchrone?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous- appelez) – wOxxOm

Répondre

0

Vous pouvez utiliser fermetures. De cette façon.

function onContextClick(info, tab) {  
    if(info["selectionText"]){ 
    getMeta(tab, function(x){ 
     console.log(x); 
     //do stuff with x 
    }); 
    } 
} 

function getMeta (tab, callback) { 
chrome.tabs.sendMessage(tab.id, {fetchTag: "meta,name,author,content"}, function(response) { 
    //alert(response.data); 
    //one thing I tired was to put my "do stuff" embedded here, but that didn't work either 
    callback(response.data); 
    }); 
} 
+0

Cela a aidé un groupe - m'a mis sur la bonne voie et ça marche pour moi maintenant. Merci une tonne - juste eu du mal à envelopper ma tête autour de celui-ci - celui-ci aurait dû être évident! Appréciez l'aide. –

+0

'Callbacks' est le terme correct, pas' closures'. Aussi, cette question a été posée et répondue des tonnes de fois, alors pointez simplement sur une copie, de préférence celle qui contient une explication comme [cette réponse] (http://stackoverflow.com/questions/14220321/how-to-return-the -réponse-d'un appel asynchrone) Je pointe toujours vers. – wOxxOm