JQuery – 在’for’语句中循环.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!'); 

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

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

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

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

 (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); 

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

 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 } 

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

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

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

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

如果你想下载一些东西 – >用数据做某事 – >下载另一件事 – >再做一次……

然后你也可以使用javascript瀑布(库或构建你自己的)来使它简单易用。 在瀑布上,您可以定义异步函数完成时应该发生的事情。