JQuery - 在'内部循环.load()。声明

时间:2016-05-09 19:12:04

标签: javascript jquery ajax for-loop load

我不确定这是否真的可行,因为load()是一种异步方法,但我需要一些方法来基本上加载几个小页面,一次一个,得到一些数据包含在它们通过JavaScript,然后通过Ajax发送,所以我可以将它放在我制作的数据库上。

基本上我从我的页面得到这个,其中我将不得不迭代的所有链接都位于:

var digiList = $('.2u');
var link;
for(var i=0;i<digiList.length;i++){

    link = "http://www.digimon-heroes.com" + $(digiList).eq(i).find('map').children().attr('href');

到目前为止一切顺利。

现在,我必须将每个链接(只有整页的特定div,而不是整个内容)加载到我的页面周围的div中,以便我可以通过JQuery的:

 var contentURI= link + ' div.row:nth-child(2)';   

    $('#single').load('grabber.php?url='+ contentURI,function(){     
 ///////////// And I do a bunch of JQuery stuff here, and save stuff into an object 
 ///////////// Aaaand then I call up an ajax request.
     $.ajax({
      url: 'insertDigi.php',
      type: 'POST',
      data: {digimon: JSON.stringify(digimon)},
      dataType: 'json',
      success: function(msg){
        console.log(msg);
      }
 ////////This calls up a script that handles everything and makes an insert into my database.
    }); //END ajax
   }); //END load callback Function
  } //END 'for' Statement.
 alert('Inserted!'); 

当然,正如预期的那样,加载时间太长,而 语句的其余部分只是继续进行,而不是真的关心让负载完成它的业务,因为负载是异步的。在我有机会加载第一页之前,会调用提醒(&#39;已插入!&#39;); 。反过来,这意味着我只能将这些内容加载到我的div中,然后才能处理它的信息并将其发送到我的脚本中。

所以我的问题是:是否有一些创造性的方式来实现这一点,我可以迭代多个链接,加载它们,与它们做生意,并完成它?如果没有,是否有一个同步替代加载,可以产生大致相同的效果?我知道它可能会完全阻止我的页面,但我可以使用它,因为页面不需要我的任何输入。

希望我用必要的细节解释所有内容,希望你们能帮我解决这个问题。谢谢!

3 个答案:

答案 0 :(得分:1)

你可能想要一个递归函数,等待一次迭代,然后再进行下一次迭代等。

(function recursive(i) {
    var digiList = $('.2u');
    var link = digiList.eq(i).find('map').children().attr('href') + ' div.row:nth-child(2)';
    $.ajax({
        url: 'grabber.php',
        data: {
            url: link
        }
    }).done(function(data) {

        // do stuff with "data"

        $.ajax({
            url: 'insertDigi.php',
            type: 'POST',
            data: {
                digimon: digimon
            },
            dataType: 'json'
        }).done(function(msg) {
            console.log(msg);
            if (i < digiList.length) {
                recursive(++i); // do the next one ... when this is one is done
            }
        });
    });
})(0);

答案 1 :(得分:1)

如果您希望它们一起运行,您可以使用闭包来保留循环中的每个数字

for (var i = 0; i < digiList.length; i++) {
    (function(num) { < // num here as the argument is actually i
        var link = "http://www.digimon-heroes.com" + $(digiList).eq(num).find('map').children().attr('href');
        var contentURI= link + ' div.row:nth-child(2)';   
        $('#single').load('grabber.php?url=' + contentURI, function() {
            ///////////// And I do a bunch of JQuery stuff here, and save stuff into an object 
            ///////////// Aaaand then I call up an ajax request.
            $.ajax({
                url: 'insertDigi.php',
                type: 'POST',
                data: {
                    digimon: JSON.stringify(digimon)
                },
                dataType: 'json',
                success: function(msg) {
                        console.log(msg);
                    }
                    ////////This calls up a script that handles everything and makes an insert into my database.
            }); //END ajax
        }); //END load callback Function
    })(i);// <-- pass in the number from the loop
}

答案 2 :(得分:0)

你总是可以使用同步ajax,但没有充分的理由。

如果您知道需要下载的文档数量(您可以计算它们或只是硬编码,如果它是常量),您可以在成功时运行一些回调函数,如果一切都完成,则继续执行需要所有文档的逻辑。

为了让它变得更好,你可以在下载所有内容时触发一个事件(在文档或任何其他对象上)(例如,“downloads_done”)并听取这个甚至是你需要做的事情。

但以上所有情况都是因为你需要做一些事情。但是我不确定我是否正确地理解了你的问题(再次阅读)。

如果您想下载某些内容 - &gt;做一些数据 - &gt;下载另一件事 - &gt;再做一次......

然后你也可以使用javascript瀑布(库或构建你自己的)来使它简单易用。在瀑布上,您可以定义异步功能一个接一个地发生什么。