2015-05-29 52 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