2015-05-29 66 views
2

我正在構建一個擴展名爲chrome,並且有一個空變量的數組變量array_out。我需要在回調函數中使用來自executeScript內的數組的值填充此數組。executeScript不填充全局變量 - Chrome擴展

但是,出於某種原因全局陣列array_out沒有被填充,因爲console.log顯示,可能是因爲chrome函數在我的jQuery之後運行?

任何幫助?

我的代碼如下:

$(document).ready(function(){ 
    var array_out = []; 

    chrome.tabs.query({currentWindow: true, active: true}, function(tabs) { 
     chrome.tabs.executeScript(tabs[0].id, { 
      code: " \ 
       var array_in = ['one', 'two', 'three']; \ 
      " 
     }, function(result){ 
      array_out = result[0]; 
      console.log('IN: ' + array_out.length); 
     }); 
    }); 
    console.log('OUT: ' + array_out.length); 
}); 

回答

1

您正在使用異步執行兩個功能。您爲chrome.tabs.querychrome.tabs.executeScript提供回調函數,但嘗試訪問僅在回調方法chrome.tabs.executeScript中設置的變量。

爲了確保您正在訪問array_out已經初始化之後,你必須把你的訪問代碼(console.log('OUT: ' + array_out.length);)在一個單獨的函數,在回調叫你的回調函數的結尾chrome.tabs.executeScript(或直接功能本身)。通過這樣做,當調用$(document).ready()時仍然執行代碼,而且在兩個異步函數在分配數組內容後調用了它們的回調函數之後,您仍然執行代碼。

例如:

var array_out = []; 

$(document).ready(function(){ 


    chrome.tabs.query({currentWindow: true, active: true}, function(tabs) { 
     chrome.tabs.executeScript(tabs[0].id, { 
      code: " \ 
       var array_in = ['one', 'two', 'three']; \ 
      " 
     }, function(result){ 
      array_out = result[0]; 
      console.log('IN: ' + array_out.length); 
      accessArray(); 
      //you can do stuff with array_out here... 
     }); 
    }); 
    //console.log('OUT: ' + array_out.length); //-- array_out will not yet be set here 
}); 

function accessArray() 
{ 
    console.log('OUT: ' + array_out.length); 

    //you can do more stuff with array_out here... 
} 
+0

能否請你告訴我怎麼樣? – gespinha

+0

如果我把'array_out'變量放在'$(document)'函數之外,怎麼辦? – gespinha

+0

你是對的,你也需要這樣做,因爲'array_out'將被用在'document.ready()'之外的函數中。但最初的問題是它沒有被賦予任何價值。這隻能在回調函數中保證,假設'result [0]'具有您想要的值。 – AnthonyDJ