JavaScript似乎在AJAX调用后停止

时间:2011-12-01 23:28:13

标签: javascript jquery ajax typeerror each

问题标题相当模糊,但这是我的情况。我有大约700多行jQuery用于Web应用程序,每个函数和代码中的“主要兴趣点”在日志激活时记录到控制台。例如,我有一些函数使用AJAX调用servlet来检索一些信息。我在AJAX请求开始时记录,如果它成功(然后打印它收集的数据)等等。因此,通过我打开页面时控制台记录的内容,它似乎在第一次AJAX调用后停止。当然,这个电话似乎工作正常,它返回的数据是完美的。正如您所看到的,它甚至按预期填充了选择框。但是,控制台日志不久后停止,让我相信由于某种原因,其他功能没有被调用...

的jQuery

$(document).ready(function() {
    Initialize();
});
function Initialize() {
    console.log("Initializing...");
    User();
    Widgets();
    if($.cookie("fogbugzId") != null) {
        console.log("Stored ID: " + $.cookie("fogbugzId"));
        $("#userSelect").val($.cookie("fogbugzId")).trigger("change");
        $("#userSelect").hide();
    } else console.log("No ID Stored!");
}
function User() {
    console.log("Initializing User...");
    $.each(FetchUsers(), function(index, user) {
        $("#userSelect").append($("<option>").val(user.id).text(user.name));
    });
    $("#userSelect").change(function() {
        if($("#userSelect").val() != "") {
            console.log("User Changed to " + $("#userSelect").val() + ": " + $("#userSelect").text());
            $.cookie("fogbugzId", $("#userSelect").val(), { expires: 365 });
        }
        Update();
    });
    console.log("User Initialized!");
}
function FetchUsers() {
    console.log("Loading Users...");
    $("#loading").show();
    $.get(servlet, { command: "getUsers" }, function(data) {
        var users = new Array();
        $(data).find("user").each(function() {
            users.push({
                id: $(this).find("id").text(),
                name: $(this).find("name").text()
            });
        });
        $.each(users, function(index, user) {
            console.log(">> " + user.id + ": " + user.name);
        });
        console.log("Users Loaded!");
        return(users);
    }, "xml").complete(function() {
        $("#loading").hide();
    }).error(function() {
        console.log("Loading Users Failed!");
    });
}
function Widgets() {
    console.log("Initializing Widgets...");
    // More Code
    console.log("Widgets Initialized!");
}

控制台

Initializing...
Initializing User...
Loading Users...
>> 267: Alex Molthan
>> 35: Bill Brinkoetter
>> 100: Bob Yoder
>> 189: Brian Cutler
>> 559: Brian Ormond
>> 400: Corey Nakamura
Users Loaded!

但是伐木就在那里停了下来。因此,从数据库中获取用户的AJAX调用工作正常,但显然User()函数无法正常完成。 JavaScript控制台给我的唯一错误是我的jquery.min.js文件中的错误:

Uncaught TypeError: Cannot read property 'length' of undefined  jquery.min.js:16
    f.e.extend.each                                             jquery.min.js:16
    User                                                        modifytime.js:14
    Initialize                                                  modifytime.js:3
    (anonymous function)                                        modifyTime.jsp:21
    f.extend._Deferred.e.resolveWith                            jquery.min.js:16
    f.e.extend.ready                                            jquery.min.js:16
    f.c.addEventListener.B                                      jquery.min.js:16

看起来好像在$.each()上打破了FetchUsers()函数返回的用户数组。我知道该函数返回可用的数组,所以我不确定它会被卡住。任何人都可以看到我失踪的东西吗?我尝试首先将users[]函数返回的FetchUsers()分配给变量,然后将其传递给$.each(),但它仍然无法正常工作。有什么建议吗?

编辑:用未压缩的版本替换jQuery的缩小版本后,似乎我传入$.each()函数的用户数组现在已.length财产,这就是它破裂的原因。为了检查,在我调用特定的$.each()函数之前,我放置了从users[].length函数返回的FetchUsers()的日志,以确定它仍然没有.length属性。然后我转到FetchUsers()函数本身并在我返回之前放置users[].length的日志。但是,这个日志工作得很好(虽然我的例子没有显示它,它返回40个用户)。那么我的users[]是不是作为数组返回?

2 个答案:

答案 0 :(得分:0)

我承认我没有阅读和理解你的源代码的每一部分(也没有检查所有大括号是否已关闭),但是FetchUsers显然不返回任何内容(与你的声明相反) - 所以对FetchUsers()的调用求值为: “未定义”。修复它需要一些重写,就像在Javascript中你不能真正从同步函数(如FetchUsers())返回异步操作(如$ .get)的结果 - 这将需要多线程(某种阻塞,等待等)。 / p>

答案 1 :(得分:0)

FetchUsers没有返回任何内容,它甚至没有返回语句。另外,$ .get是一个异步函数,因此您无法从FetchUsers函数返回它传递给回调的值。相反,您可以让FetchUsers在收到用户数据时调用它所调用的回调(在这种情况下,执行该更改将相对简单):

function User() {
    console.log("Initializing User...");
    FetchUsers(function(user) { // Changed!
        $("#userSelect").append($("<option>").val(user.id).text(user.name));
    });
    <...>
}

function FetchUsers(callback) { // Changed!
    console.log("Loading Users...");
    $("#loading").show();
    $.get(servlet, { command: "getUsers" }, function(data) {
        //var users = new Array(); No longer necessary.
        $(data).find("user").each(function() {
            callback({ // Changed!
                id: $(this).find("id").text(),
                name: $(this).find("name").text()
            });
        });
        <...>
}

使用“已更改!”更改这三行。评论应该足以使其正常工作。 (虽然您的用户日志记录需要略微更改,因为它们不再被推入阵列。)