获取wikipedia数据的Javascript循环未终止
我一直在开发一个相当大的javascript函数,当我最终认为它已经完成时,它完全停止了工作 这是:获取wikipedia数据的Javascript循环未终止,javascript,jquery,ajax,api,wikipedia,Javascript,Jquery,Ajax,Api,Wikipedia,我一直在开发一个相当大的javascript函数,当我最终认为它已经完成时,它完全停止了工作 这是: function getLinksFrom(title) { var returnArray = [], plcontinue = '', url = 'http://en.wikipedia.org/w/api.php?action=query&prop=links&titles=' + title + '&format=json&p
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;
}
函数getLinksFrom(标题){
var returnArray=[],
plcontinue='',
url='1〕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!==''){
如果(请继续!=''){
url='1〕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,
数据类型:“json”,
成功:功能(数据){
控制台日志(数据);
for(输入数据['query']['pages']){
links=数据['query']['pages'][key]['links'];
}
对于(变量i=0;ireturnArray
和plcontinue
,但这可能需要很长时间,因为您的函数体中基本上是无限(几乎)循环,这占用了大部分CPU资源
解决方案是用递归代替迭代:不是在无限循环中迭代直到成功,而是递归直到成功。从getLinksFrom
中删除while循环,并将getLinksFrom()
添加到ajax请求回调中
另一种方法是同步执行该请求。它有一个特殊的标志。是否将数据打印到控制台?这将运行一个非常紧凑的
,而循环将执行许多ajax请求。通过在
过程中删除,并使ajax调用同步,可以实现您想要实现的更好的(被认为不一定是理想的)版本。您所要求的可能与Wikipedia的使用条款背道而驰。你的脚本“已经被维基百科社区批准”了吗?试着调试你的代码,看看它要去哪里,并在控制台中打印数据时检查你的控制台。另外,如果你使用的是chrome(我相信你在其他浏览器中也可以这样做),转到控制台的“网络”选项卡将显示来自ajax请求的所有响应。.Barmaley.exe谢谢你的回答!我在这里遇到了一个新问题: