-2

我正在尝试创建一个 chrome 扩展,当我的 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
}

延迟弄乱了我代码的其他部分。

这可能是什么原因造成的?

4

3 回答 3

3

chrome.windows.create是异步的。

因此,您应该将其插入回调中,或者插入其中调用的另一个函数中。

第二个警报有效,因为当您关闭第一个警报框时,窗口已创建。(并且数组已填充)

这里有一个例子:

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

function step2() {
    alert(windowArr[0]);
}
于 2013-10-17T15:46:50.930 回答
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]);

}
于 2013-10-17T15:46:58.930 回答
0

窗口创建是异步的。chrome.windows.create安排创建并立即返回,它不等待创建窗口。当 UI 在 first 中暂停时alert(),窗口会运行完成函数,该函数会推送到数组上。因此,当第二次alert运行时,它会显示该值。

于 2013-10-17T15:47:08.970 回答