2013-05-26 3 views
0

Comment stocker l'URL d'un onglet en cours dans une variable afin de pouvoir y accéder plus tard? J'ai fait quelques recherches mais je ne comprends pas très bien les fonctions de rappel asynchrones.Variables globales et fonctions de rappel asynchrones

var currentTab;
chrome.tabs.getSelected(null, function(tab) { currentTab = tab.url; });
console.log(currentTab);

+0

[Après avoir appelé chrome.tabs.query, les résultats ne sont pas disponibles] (http://stackoverflow.com/a/11689804/938089) explique le concept de code asynchrone dans le contexte d'une extension Chrome, lisez-le et essayez de comprendre l'analogie. –

+0

Ah d'accord, je comprends bien ce qui se passe maintenant. Donc, je n'ai aucun moyen d'accéder à une variable qui est définie _inside_ une fonction async, même si elle est déclarée en haut (globalement)? – user2409821

+0

Certainement pas de la façon dont vous avez écrit dans la question. Vous devez en quelque sorte retarder l'accès à la variable, donc la solution proposée dans l'autre réponse est la meilleure option (une autre méthode serait l'utilisation de temporisateurs, par exemple 'setTimeout', mais cela conduit à des résultats imprévisibles). –

Répondre

0

Toutes les méthodes Chrome sont asynchrones, ce qui signifie qu'ils viennent faire la queue le code à appeler plus tard.

Notez également que tabs.getSelectedhas been deprecated, donc j'utilise tabs.query({active: true}... à la place.

Les feux de rappel sur l'ordre, après tout le reste a fini:

var currentTab;     // 1 

chrome.tabs.query({active: true}, // 2, queues up callback and continues 
    function(tabs) { 
     currentTab = tabs[0].url; // 4, last, after everything else 
    }); 

console.log(currentTab);   // 3 callback hasn't fired yet, so undefined 

Bienvenue sur ce qui est parfois appelé « l'enfer de rappel ». La méthode la plus simple consiste à utiliser une bibliothèque d'encapsulation asynchrone ou promesse, telle que chrome-extension-async. Cela vous permet de recourir async/await syntaxe:

async function yourCode() { 
    try { 
     const currentTabs = await chrome.tabs.query({active: true}); 
     const currentTab = currentTabs[0]; 
     console.log(currentTab); 
    } 
    catch(err) { 
     // Log errors etc 
    } 
} 

Vous êtes toujours faire un code de rappel et l'exécution après c'est fini, mais maintenant vous pouvez facilement utiliser des variables avant et après la await. J'ai récemment blogged about that in a lot more detail than will fit here.

Questions connexes