Javascript array.length为0,直到我发出警报()

时间:2012-07-09 21:36:10

标签: javascript scope alert

我正在尝试编写一些基于Sharepoint WebServices getList响应构建html控件的javascript。我将控件存储在一个数组中。构建数组后,长度为0,直到我执行警报,然后它变为正确的数字。

var controls = [];

$(document).ready(function() {
    // Make call to WebServices to retrieve list data
    $().SPServices({
        operation:    "GetList",
        listName:     qs["list"],
        completefunc: parseList
    });

    console.log(controls.length);           // this outputs 0
    alert("This has to be here to work.");  // this has to be here, no idea why
    console.log(controls.length);           // this outputs 6
    for (var i=0; i<controls.length; i++) {
        controls[i].addControl();
    }
});

function parseList(xData,status) {
    $(xData.responseXML).find("Field").each(function() {
        if ($(this).attr("ID") && $(this).attr("SourceID") != "http://schemas.microsoft.com/sharepoint/v3") {
            if ($(this).attr("Type") == "Text") {
                controls.push(new Textbox(this));
            } else if ($(this).attr("Type") == "Choice" && $(this).attr("Format") == "Dropdown") {
                controls.push(new Dropdown(this));
            } else if ($(this).attr("Type") == "Choice" && $(this).attr("Format") == "RadioButtons") {
                controls.push(new RadioButtons(this));
            } else if ($(this).attr("Type") == "MultiChoice") {
                controls.push(new MultiChoice(this));
            } else if ($(this).attr("Type") == "Boolean") {
                controls.push(new Boolean(this));
            }
        }
    });
}

警报似乎是使controls.length正常工作的唯一因素。我只能认为这是某种范围问题。任何见解都表示赞赏。

2 个答案:

答案 0 :(得分:1)

这可能是由于这个异步代码

$().SPServices({
        operation:    "GetList",
        listName:     qs["list"],
        completefunc: parseList
});

警报暂时停止线程执行,以允许调用回调函数

所以试着移动这部分

console.log(controls.length);           // this outputs 6
for (var i=0; i<controls.length; i++) {
    controls[i].addControl();
}

进入parseList()函数

答案 1 :(得分:1)

$().SPServices是一个异步函数。在调用controls之前,不会填充parseList数组。移动循环以将控件添加到parseList回调。