我正在尝试循环调用 3 个具有相同命名约定和结构(但数据略有不同)的不同 json 文件的 ajax 调用。自从我在论坛中阅读 Alnitak 的回复(jQuery ajax 成功回调函数定义)以来,我一直在使用延迟对象而不是成功选项,以便我的 ajax 处理和回调处理可以解耦。下面是我的代码:
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-1" />
<title>Stuff</title>
<script src="jquery-1.9.1.min.js" type="text/javascript"></script>
</head>
<body>
<script Language="JavaScript">
var myData = [];
var myURL = ["ticker1.json","ticker2.json","ticker3.json"]; //New Array for my URLs
function getData(m) {
return $.ajax({
url : myURL[m], //<<<---Want to loop through this array
type : 'GET',
dataType: 'json'
});
}
function handleData(data){
for (var i=0; i<data.test.msgOne.length; i++){
myData[i] = data.test.msgOne[i];
}
};
for (var j=0; j<3; j++){
console.log(j); //<<---First console statement
var ajaxCall = getData(j).done(handleData);
$.when(ajaxCall).done(function(){ //wait until the ajax call is done before writing
console.log(j); //<<---Second console statement
for (var k=0; k<3; k++){
document.write(myData[k])
document.write('<br><br>');
}
});
}
</script>
</body>
</html>
我的代码由一个名为 getData 的函数组成,它执行 ajax 调用,然后是一个名为 handleData 的函数,它简单地遍历来自 ajax 调用的 json 文件中的数据,并将数据存储在数组 myData 中。然后 for 循环尝试将数组 myData 的数据输出到屏幕。但是,问题是我只从屏幕上的第一个 json 文件输出中获取数据,而不是按顺序获取所有三个。
所以我所做的是在 for 循环中输入两个 console.log 语句:一个在 ajax 调用之前,一个在 ajax 调用完成之后。第一个console.log按预期顺序输出0,1,2,第二个给出3,这是出乎意料的。因此,我假设在计数器完成之前没有返回 ajax 调用。我用一些逻辑语句和一个while循环替换了for循环(是的,我知道代码无限期运行的危险),如下所示:
var j=0;
var whileFlag= new Boolean(1);
var ajaxFlag = new Boolean(1);
while (whileFlag) {
if (ajaxFlag > 0) {
ajaxFlag = 0;
console.log(j);
var ajaxCall = getData(j).done(handleData);
}
$.when(ajaxCall).done(function(){
console.log(j);
for (var k=0; k<3; k++){
document.write(myData[k])
document.write('<br><br>');
}
ajaxFlag = 1;
j++;
});
if (j>=3) {whileFlag = 0};
}
替换代码试图强制 ajax 调用完成,然后在进入下一个 ajax 调用之前执行代码。好吧,最终的结果是一个冻结的浏览器,这不是 bueno。有谁知道我如何能够将我的每个 json 文件的 myData 数组写入屏幕?任何帮助和建设性意见表示赞赏。另外,我需要保持 ajax 调用异步,因为我将来会使用 jsonp 数据类型。
附加问题:我认为浏览器挂起是由于ajax没有返回调用,但问题是为什么?如果我在第一个示例中选择不实现 for 循环,而只是将 j 变量显式设置为 0、1 或 2,则所选 json 文件的数据打印输出良好,但如果我做的不止它只会打印第一个 json 文件中的数据集。就好像不可能进行多个 ajax 调用之类的。任何见解和帮助表示赞赏。谢谢。