Javascript jQuery会在很长时间后显示结果

Javascript jQuery会在很长时间后显示结果,javascript,jquery,Javascript,Jquery,我使用jQuery 1.12.4是因为我必须与IE8及以上版本兼容,这是我的代码: $(document).ready(function(){ var pagesUrl = "https://en.wikipedia.org/w/api.php?action=query&format=json&origin=*&list=categorymembers&indexpageids=1&cmtitle=Category%3AEnglish-langua

我使用jQuery 1.12.4是因为我必须与IE8及以上版本兼容,这是我的代码:

$(document).ready(function(){
    var pagesUrl = "https://en.wikipedia.org/w/api.php?action=query&format=json&origin=*&list=categorymembers&indexpageids=1&cmtitle=Category%3AEnglish-language+film+directors&cmtype=page&cmlimit=50";
    var randomTitles = [];
    $.getJSON(pagesUrl, function(data){
        var pages = data.query.categorymembers;
        for(var i = 0; i < 20; i++){
            do{
                var index = Math.round(Math.random()*49);
            }while(randomTitles.indexOf(pages[index].title) != -1);
            randomTitles[pages[index].pageid] = pages[index].title;
        }
        console.log(randomTitles);
    });
});
它应该从Wikipedia收到一个JSON文件,其中有一个类别中大约50页的信息。它选择了20个随机页面,并用维基百科页面id:Wikipedia页面标题对填充关联数组

它完成了它的工作,但结果可能只在10秒后才会显示。 任何人都可以向我解释,首先,为什么,然后,如何解决这个问题?
谢谢,我对jQuery世界很陌生

这需要很长的时间,因为你循环了大量的次数,而次数被定义为你的页面ID有多高,它们之间的ID有多远。下面的代码稍微调整了您的原始页面,拉下50页,然后在20次迭代中随机抓取其中20页,因此显然要快得多

$(document).ready(function(){
    var pagesUrl = "https://en.wikipedia.org/w/api.php?action=query&format=json&origin=*&list=categorymembers&indexpageids=1&cmtitle=Category%3AEnglish-language+film+directors&cmtype=page&cmlimit=50";
    var randomTitles = [];
    $.getJSON(pagesUrl, function(data){
        var pages = data.query.categorymembers;
        for(var i = 0; i < 20; i++){
            var page = pages.splice(Math.floor(Math.random() * pages.length), 1)[0]
            randomTitles[page.pageid] = page.title
        }
        console.log(randomTitles);
    });
});

正如Lance所提到的,循环效率很低,并且循环的迭代次数越多,循环速度就越慢。我做的另一个改变是将你的随机标题从一个数组改为一个对象,这样可以防止你的数组变得和维基百科结果中最大的ID一样大

var pagesUrl=https://en.wikipedia.org/w/api.php?action=query&format=json&origin=*&list=categorymembers&indexpageId=1&cmtitle=Category%3英语+电影+导演&cmtype=page&cmlimit=50; var randomTitles={}; $.getJSONpagesUrl,functiondata{ var pages=data.query.categorymembers; forvar i=0;i<20;i++{ var指数=Math.floorMath.random*50-i; randomTitles[pages[index].pageid]=pages[index].title; 页面索引,索引+1 } console.lograndom标题; };
通过控制台,我观察到您的随机标题:

(53029416) [undefined × 32901, "Woody Allen", undefined × 29907, "Warren Beatty", undefined × 29543,  ...] 
这些未定义的*32901是由randomTitles[pages[index].pageid]引起的,它在pageid:419280跳出一个较大的间隙后,在randomTitles数组中创建了大量未定义的项

要解决此问题,您可以将其更改为:

randomTitles[i] = pages[index].title;

您可以设置一个断点并遍历代码,以查看是否有任何操作花费的时间超过了excepted。使用浏览器开发工具。查看DevTools中的“网络”选项卡,查看Wikipedia回答请求需要多长时间。如果需要10秒,问题不在代码中,而是在代码的末尾。也许可以试着要求少一些页面。如果您向他们发送大量请求,他们可能会有一个速率限制。