请原谅这个尴尬的标题,我会尽力解释我的特殊问题。
我有三位javascript代码:
应该注意的是,自执行代码和回调函数是在它们自己的闭包中定义的。通过导入的命名闭包访问ajax函数,我将其定义为 $ 。
我对JavaScript很新,我还在学习闭包及其范围。我有理由相信这个问题可能与此有关。
无论如何,我的问题涉及尝试访问所谓的填充数组。由于我将数组定义在合适的范围内(或者我相信)作为解析函数,我认为我应该没有问题将项目推入其中。
这是自我解释:
(function ($){
//Load stock
var items = [];
var response = $.Ajax("scripts/Lookup.php","GET",parse);
function parse(a){
for(/*Simplified view*/){
var item = new $.Item();
item.name = domStuff.textContent;
item.description = domStuff.textContent;
item.price = domStuff.textContent;
item.id = domStuff.textContent;
items.push(item);
}
}
//Test the length (and verify contents)
for(var i=0; i < items.length; i++){
alert(items[i].price);
}
}($));
这是我的定义,包括Ajax函数:
var $ = (function(){
var s = {};
var ajax = function(url,method,callback){
var a = new XMLHttpRequest();
a.open(method, url, true);
a.onreadystatechange = function(){
if(this.readyState==4){
callback(a);
}
}
a.send();
};
s.Ajax = (function(){
return ajax;
}());
return s;
}());
所以标题的合理性在于,当我用firebug探测代码时,我可以看到 items 填充了3个被解析数据正确定义的对象。
循环然后按预期警告3次。
但是,如果我删除断点并让firebug忽略代码,则循环不会播放,我只能假设数组为空。
如果我在测试循环之前警告(项目),代码也会起作用。
答案 0 :(得分:2)
AJAX正在填充项asynchronously,意思是在你的闭包中,在第一次执行items.length将为零(从原始数组初始化)。随着时间的推移,通过调用parse
方法的AJAX将填充此数组。
因为你将items
保留在一个闭包中,你实际上无法从外部访问它 - 这是一个很好的做法,但可能会导致调试问题!而不是items.push(item)
尝试alert(item)
(任何浏览器,但执行阻止)或console.log(item)
(仅限firebug),以确定您确实从AJAX获取结果而不是初始执行
答案 1 :(得分:1)
我无论如何都不是JavaScript专家。但是,我遇到了调试解决了问题的其他编程语言的情况。
在这些情况下,调试已经将代码放慢到足以使其工作。某些进程A需要异步进程B来返回对象或在执行超出某个点之前执行某些操作。在这些类型的场景中最有可能发生的是主线程正在继续或不等待对象被另一个例程填充。
我希望有所帮助。
答案 2 :(得分:1)
您的解析函数是异步调用的。在测试之前,您需要等待调用解析函数。
在您解析函数中测试结果或者使用另一个函数作为ajax调用的回调。此函数调用parse,然后测试结果。