获取wikipedia数据的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

我一直在开发一个相当大的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;
}
函数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;i 据我所知,它一定是卡在while循环中了,因为页面冻结了。但随着每个循环的进行,returnArray会不断增长,我正在用一些不会设置PLARRAY的东西来测试它

知道出了什么问题吗?可能是一些异步加载的东西,我是新手

编辑:所以我通过有用的评论发现,它一次又一次地循环发出越来越多的请求,而不必等到ajax完成后再重新开始。如何阻止它这样做?

关键是AJAX是异步的。这意味着当JS需要执行请求时,它会发送请求并继续执行,继续执行其余的代码。当请求完成时,将触发回调

因此,在您的代码中,它的工作原理如下:

  • 变量的初始化
  • While循环条件检查。条件为true,因此转到循环体
  • 执行ajax请求。我们发送请求并继续
  • 再次检查情况。因为并没有任何变化(请求并没有时间完成),所以条件仍然为真
  • 等等
  • 最终,可能十几个请求中的一个将结束,修改
    returnArray
    plcontinue
    ,但这可能需要很长时间,因为您的函数体中基本上是无限(几乎)循环,这占用了大部分CPU资源

    解决方案是用递归代替迭代:不是在无限循环中迭代直到成功,而是递归直到成功。从
    getLinksFrom
    中删除while循环,并将
    getLinksFrom()
    添加到ajax请求回调中


    另一种方法是同步执行该请求。它有一个特殊的标志。

    是否将数据打印到控制台?这将运行一个非常紧凑的
    ,而
    循环将执行许多ajax请求。通过在
    过程中删除
    ,并使ajax调用同步,可以实现您想要实现的更好的(被认为不一定是理想的)版本。您所要求的可能与Wikipedia的使用条款背道而驰。你的脚本“已经被维基百科社区批准”了吗?试着调试你的代码,看看它要去哪里,并在控制台中打印数据时检查你的控制台。另外,如果你使用的是chrome(我相信你在其他浏览器中也可以这样做),转到控制台的“网络”选项卡将显示来自ajax请求的所有响应。.Barmaley.exe谢谢你的回答!我在这里遇到了一个新问题: