0

У меня есть две переменные, которые устанавливаются в «возвращаемое значение» функций, эти функции должны получать URL-адрес вкладки и ссылку на фактический объект табуляции и хранить их в переменных. У меня есть некоторый код:Расширение Chrome: вкладки запросов async

function init(){ 
    var url = getUrl(); 
    var tab = getTab(); 
} 

function getUrl(){ 
    var tablink; 
    chrome.tabs.query({currentWindow: true, active: true},function(tabs){ 
     tablink = tabs[0].url; 
     return tablink; 
    }); 

} 

function getTab(){ 
    var tab; 
    chrome.tabs.query({currentWindow: true, active: true},function(tabs){ 
     tab = tabs[0]; 
    }); 
    return tab; 
} 

Почему, URL не определен, хотя я возвращаюсь к URL из функции обратного вызова, но когда я возвращаюсь вкладку из-за пределов обратного вызова, он возвращает в порядке, так как хотя это был синхронный звонок. У меня есть screenshot этого явления в отладчике. Я стараюсь научиться разбираться с асинхронными методами в хроме, но это очень запутанно. Может ли кто-нибудь объяснить это поведение мне?

+1

возможно дубликат [После вызова chrome.tabs.query, результаты не доступны] (http://stackoverflow.com/questions/11688171/after-calling-chrome-tabs-query-the- results-are-not-available) –

ответ

3

Как вы уже сказали, функция chrome.tabs.query является асинхронной. Из-за этого вы не можете полагаться на return, вместо этого вы должны использовать обратные вызовы. Документация для расширения Chrome объясняет это довольно хорошо: http://developer.chrome.com/extensions/overview.html#sync-example

Так что в вашем случае что-то подобное может работать (в зависимости от того, что вы хотите позже с ним).

var url, tab; 
function init(){ 
    chrome.tabs.query({currentWindow: true, active: true},function(tabs){ 
     url = tabs[0].url; 
     tab = tabs[0]; 
     //Now that we have the data we can proceed and do something with it 
     processTab(); 
    }); 
} 

function processTab(){ 
    // Use url & tab as you like 
    console.log(url); 
    console.log(tab); 
} 
+0

Я действительно хочу, чтобы сохранить вкладку как переменную. Я не могу определить способ доступа к результатам асинхронной функции после выполнения функции. – aclave1

+0

Я немного скорректировал свой ответ, так что результаты теперь хранятся в переменных, а не передают их напрямую. Но поскольку это выполняется как асинхронный, вам необходимо использовать дополнительную функцию для дальнейшего использования данных (это обратный вызов). –

+0

Протестировано, и это отлично работает. – aclave1

Смежные вопросы