我正在使用一个使用jquery的函数来从JSON提要中获取信息。这里的问题是,从提要中,我必须选择10个符合在过去一年内的条件的项(为了参数的需要,从请求中选择310亿毫秒),并且我必须指定我希望从提要中插入变量“maxrows”得到多少结果。这是功能……
function topTen(rows) {
$.getJSON("http://ws.geonames.org/earthquakesJSON?north=90&south=-90&east=-180&west=180&maxRows=" + rows,
function(json) {
var topTen = new Array();
var now = new Date();
var i;
for(i = 0; i < json.earthquakes.length; i++)
{
var time = json.earthquakes[i].datetime;
var then = new Date(time.replace(" ", "T"));
if(now - then < 31536000000) { topTen.push(json.earthquakes[i].eqid); }
}
if(topTen.length >= 10)
{
var html = "The Top Ten Earthquakes Of The Past Year<ol>";
for(i = 1; i <= 10; i++)
{
html += "<li id='number" + i + "' >" + topTen[i - 1] + "</li>";
}
html += "</ol>";
$('#top_ten').html(html);
}
});
}
现在的问题是,从第一个请求中,我可能不会得到10个符合我标准的结果。所以为了抵消这一点,我尝试将函数放在一个循环中,直到满足另一个条件。但是,这总是以失败告终,因为getjson函数(或者回调)是异步的,这意味着如果我尝试类似的方法
var rows = 10;
do{
topTen(rows);
rows += 10;
while(!document.getElementById("number10"))
然而,问题就变成了,执行实际工作的函数不受循环的逐行计时的约束,因此循环本身在任何函数实际完成并满足循环条件之前运行多次、多次、多次。所以现在我正在尝试设计另一种方法
topTen(rows);
rows += 10;
pause(1000);
topTen(rows);
rows += 10;
pause(1000);
topTen(rows);
rows += 10;
pause(1000);
if(document.getElementById("number10"))
alert("There's 10!");
else
alert("There's not 10!");
暂停基本上就是它的声音,需要几毫秒的时间。在我复制和粘贴的循环中,将初始日期对象与后期日期对象进行简单比较。这样做的目的是防止函数一个接一个地触发,但问题是如果条件永远不满足。我不知道它是什么,但不管我允许暂停多少时间,getElementByID函数似乎从未找到ID为“数字10”的元素,尽管我在Firebug中可以很清楚地看到它。
由于这个问题,我的浏览器已经崩溃了好几次,我真的很讨厌它。如果有人能找到解决这个问题的方法,甚至能提出更简单、更优雅的解决方案,我将永远感激。
ps-我尝试过全局变量和使用递归从回调函数内部调用topten()并发送一个更大的“rows”变量,但这些方法不起作用,因为回调函数似乎位于它们自己包含的小世界中,其中90%的剩余javascript不存在。