-2

我正在試驗創建一個Chrome擴展,並且在執行JavaScript時遇到了一個非常奇怪的問題。一些代碼接口延遲運行。在執行某個函數時是否存在一些JavaScript延遲

下面是代碼:

var windowArr = new Array(); 

function create(t) //t = tab to create new window with 
{ 
    newWindow = new Object(); 
    newWindow.tabId = t.id; 
    chrome.windows.create(newWindow, function(w){windowArr.push(w.id);}); //w = new window 

    // Here is where it gets weird 
    alert(windowArr[0]);// returns "undefined" 
    alert(windowArr[0]);// returns "573" // the correct value 
} 

延遲是搞亂我的代碼等部位。

這可能是什麼原因造成的?

回答

3

chrome.windows.create是異步的。

所以你應該把它插入到回調中,或者在其內部調用的另一個函數中。

第二個警告的工作原理是因爲當您關閉第一個警告框時,該窗口已創建。 (和數組填滿)

這裏一個例子:

chrome.windows.create(newWindow, function(w){ 
    windowArr.push(w.id); 
    step2(); 
}); 

function step2() { 
    alert(windowArr[0]); 
} 
+0

我的程序實際上是通過多個選項卡循環運行的。所以理想情況下,我想暫停我的程序,直到創建新窗口並調用其回調函數。你知道是否有任何構建函數或方法來做到這一點,或者我應該在調用chrome.windows.create之後添加一些類似於10毫秒的延遲? –

1

這是因爲你的回調函數,你的alert是異步運行。如果你想看到的值,把警報陳述你的回調函數中:

function create(t) //t = tab to create new window with 
{ 
    newWindow = new Object(); 
    newWindow.tabId = t.id; 
    chrome.windows.create(newWindow, function(w){ 
     windowArr.push(w.id); 
     alert(windowArr[0]); 
     alert(windowArr[0]); 
    }); 
} 

或者,如果您希望將這些值賦給一個局部變量,你可以做這樣的事情:

function create(t) //t = tab to create new window with 
{ 
    newWindow = new Object(); 
    newWindow.tabId = t.id; 
    var myArray = []; 
    chrome.windows.create(newWindow, function(w){ 
     myArray.push(w.id); 
    }); 

    alert(myArray[0]); 

} 
0

窗口創建是異步的。 chrome.windows.create立即安排創建並返回,它不會等待創建窗口。當用戶界面在第一個alert()中暫停時,該窗口將運行完成功能,該功能將壓入陣列。因此,當第二個alert運行時,它顯示值。

相關問題