2017-02-20 8 views
0

Так что у меня возникла проблема, что я не могу понять себя даже после нескольких часов проб и ошибок и, конечно, несколько запросов на этом сайте ,push() внутри chrome.tabs.query не добавляет в массив правильно

Я в основном пытаются заполнить массив с названиями всех открытых вкладок в Chrome, но посмотрите сами:

var children = []; 

function updateList(){ 
    chrome.tabs.query({}, function(tabs){ 
     for(i = 0; i < tabs.length; i++){ 
      children.push(tabs[i].title); 
     } 
    }) 
    children.push("test") 
} 


console.log(children); 
console.log(children.length); 
updateList(); 
console.log(children); 
console.log(children.length); 

Моя проблема заключается в том, что элементы массива, что я толчок() - внутри запроса вкладок на самом деле не обрабатываются, как и записи массива. Они отображаются в консоли, когда я проверяю массив, и они изменяют длину в соответствии с Chrome, но когда я регистрирую длину массива, они не учитываются. Не могу я получить доступ к ним, делая что-то вроде:

children[2] 

Я понятия не имею, что является причиной этого, но я надеюсь, что кто-то здесь может сказать мне, что есть!


EDIT: Хорошо, так что я по какой-то причине не пробовали вручную проверить длину массива в консоли Chrome, но я сделал это сейчас. Длина правильная, поэтому кажется, что запрос занимает слишком много времени, чтобы она вступила в силу. Теперь возникает вопрос: как заставить мою программу ждать завершения запроса?

ответ

0

chrome.tabs.query is async, поэтому он требует обратного вызова. Чтобы обеспечить завершение обратного вызова query, добавьте свои собственные к updateList следующим образом:

var children = []; 

function updateList(callback){ 
    chrome.tabs.query({}, function(tabs){ 
     for(i = 0; i < tabs.length; i++){ 
      children.push(tabs[i].title); 
     } 

     children.push("test") 
     if (callback) { 
      console.log('calling updateList callback'); 
      callback(); 
     } 
    }) 
} 


console.log(children); 
console.log(children.length); 
console.log('calling updateList') 
updateList(function() { 
    console.log('in updateList callback'); 
    console.log(children); 
    console.log(children.length); 
}); 
console.log('called updateList');