问题标题相当模糊,但这是我的情况。我有大约700多行jQuery用于Web应用程序,每个函数和代码中的“主要兴趣点”在日志激活时记录到控制台。例如,我有一些函数使用AJAX调用servlet来检索一些信息。我在AJAX请求开始时记录,如果它成功(然后打印它收集的数据)等等。因此,通过我打开页面时控制台记录的内容,它似乎在第一次AJAX调用后停止。当然,这个电话似乎工作正常,它返回的数据是完美的。正如您所看到的,它甚至按预期填充了选择框。但是,控制台日志不久后停止,让我相信由于某种原因,其他功能没有被调用...
$(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[]
是不是作为数组返回?
答案 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()
});
});
<...>
}
使用“已更改!”更改这三行。评论应该足以使其正常工作。 (虽然您的用户日志记录需要略微更改,因为它们不再被推入阵列。)