我一直在研究一个相当大的javascript函数,当我最终认为它已经完成时,它完全停止了工作。
这是:
function getLinksFrom(title) {
var returnArray = [],
plcontinue = '',
url = 'http://en.wikipedia.org/w/api.php?action=query&prop=links&titles=' + title + '&format=json&pllimit=500&plnamespace=0&callback=?';
while (returnArray.length === 0 || plcontinue !== '') {
if (plcontinue !== '') {
url = 'http://en.wikipedia.org/w/api.php?action=query&prop=links&titles=' + title + '&format=json&pllimit=500&plnamespace=0&plcontinue=' + plcontinue + '&callback=?';
}
$.ajax({url: url,
dataType: 'json',
success: function(data) {
console.log(data);
for (key in data['query']['pages']) {
links = data['query']['pages'][key]['links'];
}
for (var i = 0; i < links.length; i += 1) {
returnArray.push(links[i]['title']);
}
if (data.hasOwnProperty('query-continue')) {
plcontinue = data['query-continue']['links']['plcontinue'];
} else {
plcontinue = '';
}
}
});
}
return returnArray;
}
从我所知道的,它必须陷入while循环,因为页面只是冻结了。但是对于每个循环,returnArray都会增长,而我正在使用不会设置的内容来测试它。
知道出了什么问题吗?可能是异步加载的东西,我是新手。
编辑:所以我通过有用的评论发现,它一次又一次地循环,无需等待ajax再次启动之前就发出越来越多的请求。我怎么能阻止它呢?
答案 0 :(得分:2)
关键是AJAX是异步。这意味着当JS需要执行请求时,它会发送并继续执行其余的代码。请求完成后,将触发回调。
所以在你的代码中它会像那样:
最终,也许,十几个请求中的一个会结束,修改returnArray
和plcontinue
,但这可能需要很长时间,因为你在函数体中所拥有的基本上是无限的(几乎) loop,占用大部分CPU资源。
解决方案是用递归替换迭代:而不是在无限循环中迭代直到成功,你可以递归到成功。从getLinksFrom
删除while循环,并将getLinksFrom()
添加到ajax请求回调。
另一个方法是执行该请求同步。它有一个特殊的标志。