我正在尝试创建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
}
延迟会搞砸我代码的其他部分。
导致这种情况的原因是什么?
答案 0 :(得分:3)
chrome.windows.create
是异步的。
所以你应该把它插入回调中,或者在其中调用的另一个函数中。
第二个警报有效,因为当你关闭第一个警告框时,窗口已经创建。 (并且数组已填满)
这里有一个例子:
chrome.windows.create(newWindow, function(w){
windowArr.push(w.id);
step2();
});
function step2() {
alert(windowArr[0]);
}
答案 1 :(得分:1)
这是因为您的函数回调和alert
异步运行。如果要查看值,请将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]);
}
答案 2 :(得分:0)
窗口创建是异步的。 chrome.windows.create
安排创建并立即返回,它不等待创建窗口。当UI在第一个alert()
中暂停时,窗口会运行完成功能,该功能会推送到阵列上。因此,当第二个alert
运行时,它会显示值。