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.getSelected
has 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.
[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. –
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
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). –