仅在.each()完成后继续执行

我正在寻找一种只有在.each()完成执行后调用函数的方法。 在下面的示例中,如何确保postPreparation() $('.element').each() postPreparation() 后立即运行?

 $('.element').each(function() { /** * 'prepareLayer()' is a complex function that takes a while to complete and, * as in this construct, needs to be invoked for each matched element. Basically, * 'prepareLayer()' adds a lot of new HTML elements to the page. */ prepareLayer(); }); /** * Ideally, this should immediately run _after_ the above function completes * ie after each '.element' finishes running prepareLayer(). * * 'postPreparation()' needs to attach some event handlers for the new HTML elements * created in 'prepareLayer()'. */ postPreparation(); 

从技术上讲,我正在寻找一种方法来调用.each()的回调函数。

注意 :我刚刚在上面的例子中确认, postPreparation()只有在.each()完成后才会执行。 问题是我的prepareLayer()使用AJAX构建新的HTML元素,因此each()返回prematurly。 正如@Alnitak所建议的那样,异步AJAX请求不会阻止.each()过早返回。

除非prepareLayer()正在做一些异步(例如AJAX或动画),否则每次循环都不能终止,直到prepareLayer()完成,你的代码已经完成了你想做的事情。

FWIW,如果你现有的.each循环中没有其他操作或参数,你实际上只需要写这个:

 $('.element').each(prepareLayer); 

即,不需要addtional匿名函数包装器。

另一方面,如果它正在执行异步操作,请使用延迟对象:

 var def = []; $('.element').each(function() { // have prepareLayer return a _promise_ to return def.push(prepareLayer()); } function prepareLayer() { var jqxhr = $.get(..., function() { // do stuff with content }); return jqxhr; } // use "when" to call "postPreparation" once every // promise has been resolved $.when.apply($, def).done(postPreparation); 

我会将对postPreperation的调用postPreperation成某种反对象。

例如:

 function createEvent(numOfSignals, callback) { var _event = {}; _event.signal = function() { if(numOfSignals > 1) { numOfSignals--; } else { callback(); } }; return _event; } var event = createEvent(numOfPreperations, postPreperation); 

然后在prepareLayer ,我调用event.signal() 。 如果numOfSignals为1,则立即调用postPreperation

你会想要改进这个,但基本的想法应该有效。 你可以在这里看看这个想法的一个例子。

使用jquery承诺:

 $('.element').promise().done(function() { postPreparation(); });