jquery .each()替代方法没有正确循环

希望我只是遗漏了一些东西,这很简单……

我有一个循环遍历URL列表的页面,对它们进行Ajax调用(使用jquery),从返回的HTML中获取数据,并将其显示在表中。 这些调用工作正常。 由于实时获取这些数据需要一段时间(可能需要长达5分钟才能遍历列表,返回数据,显示它等等。)Chrome和IE等浏览器在这个繁重的处理过程中“锁定” – 实际上是Chrome定期显示“页面无响应”消息,而IE似乎只是挂起,然后突然,结果显示在屏幕上。

为了解决这个问题,我研究了如何优化jQuery .each()函数并找到一个名为slowEach ( LINK )的自定义插件,它基本上在每次循环迭代后插入一个小超时 – 以便浏览器获得响应,而不是认为客户没有反应。 我已经更新了我的代码来调用slowEach插件而不是.each,一切正常,几乎可以! 似乎在第一次迭代之后 – 插件实际上执行了额外的代码 – 一直到我的回调函数的末尾,然后突然想要跳回到循环并继续正确地继续其余的迭代。

我很难跟踪为什么会发生这种情况。

这是我的代码(parseXml只是一个处理一些XML数据的回调函数):

function parseXml(x) { var $rowArray = $(x).find("[nodeName=z:row]"); $rowArray.slowEach(250, function(index) { // ... processing each returned row }); // ... extra processing after the loop is completed. Show data on the screen. }; 

这是slowEach插件:

 $.slowEach = function( array, interval, callback ) { if( ! array.length ) return; var i = 0; next(); function next() { if( callback.call( array[i], i, array[i] ) !== false ) if( ++i < array.length ) setTimeout( next, interval ); } }; $.fn.slowEach = function( interval, callback ) { $.slowEach( this, interval, callback ); }; 

这段代码以某种方式进入我代码的“额外处理”部分 – 仅在循环的第一次迭代中。 很奇怪。 也许一些额外的眼球可以帮助我理解代码为什么这样做。 如果需要更多信息,请告诉我! 谢谢。

.slowEach使用setTimout ,它实质上推迟了该函数( each函数的内容)的执行,直到完成所有其他页面处理。 因此, slowEach调用之外的代码将全部执行,包括调用后的代码。 您需要做的是在.sloweach函数中添加另一个函数,以便在处理.sloweach所有项目后调用,并将// ... extra processing ...代码放在那里。

未经测试的代码,但这应该工作或至少让你朝着正确的方向前进:

 function parseXml(x) { var $rowArray = $(x).find("[nodeName=z:row]"); $rowArray.slowEach(250, function(index) { // ... processing each returned row }, function() { // ... extra processing after the loop is completed. // Show data on the screen. }); }; 

改变插件:

 $.slowEach = function( array, interval, callback, onCompletion ) { if( ! array.length ) return; var i = 0; next(); function next() { if( callback.call( array[i], i, array[i] ) !== false ) if( ++i < array.length ) setTimeout( next, interval ); else setTimeout( onCompletion, interval ); } }; $.fn.slowEach = function( interval, callback, onCompletion ) { $.slowEach( this, interval, callback, onCompletion ); };