编辑- 脚本文件的 Js fiddle 链接 - http://jsfiddle.net/r4uH3/
编辑 2 重新接受答案虽然问题已经结束,但我想我会添加一些关于为什么我接受下面的答案的细节。
另请参阅为什么原始代码不起作用 -如何从异步调用返回响应?- AJAX 的要点并不是字面上相关的,但对异步性的解释很重要。
Fabrício Matté 的回答对我来说非常适合,尽管我稍微调整了一下:
(function($){
// some pre-iteration stuff here
// iteration vars
var elementIndex = 0;
var collectionLength = this.size();
var ts = this;
// THIS IS THE KEY BIT AS PER ACCEPTED ANSWER
// RATHER THAN USING THE NORMAL "this.each"
(function initLoop(){
// check if got to last element
if (elementIndex < collectionLength){
// DO STUFF, WHATEVER, AS LONG AS YOU DON'T EXPECT
// ASYNCHRONOUS FUNCTIONS LIKE AJAX / TIMERS NOT TO, WELL, EXECUTE ASYNCHRONOUSLY UNLESS YOU HANDLE THEM PROPERLY!!
// AND FINALLY - GO TO NEXT ELEMENT IN COLLECTION
initLoop();
};
})());
})(jQuery);
另一件有帮助的事情,虽然不完全相关,但使用存储的全局变量和特定于元素的变量 usingjQuery(el).data();
而不是 using window.VARIABLENAME
or MyNamespace.VARIABLE_NAME
。例如:
// outside of iteration
jQuery(window).data("GLOBAL_STUFF", { /* add properties here and set them later*/ });
var globalData = jQuery(window).data("GLOBAL_STUFF");
// inside iteration
jQuery(currentElement).data("ELEMENT_DATA", { /* add properties here and set them later*/ });
var elementData = jQuery(window).data("ELEMENT_DATA");
// then set props like so (obviously get, similarly..)
globalData.someArrayOfSomething.push(something);
elementData.someBooleanValue = true;
再次感谢Fabrício。
我编写了一个 jQuery 插件,与大多数插件一样,它可以在多个(即一组)元素上执行。
在
this.each(function(i,el){ });
函数部分,我创建了另一个对象类型的新实例(与 jQuery 无关)并调用它的“Init”方法。我希望使用 .each 循环,在完全执行 init 方法后,它将循环到下一个实例。
我没有在任何地方使用任何异步(AJAX / 计时器)。
我总是在“jQuery.fadeIn”或类似的东西上使用回调。
问题
Init 方法实际上是并行调用的。在调用下一个之前,它们没有完成执行。
任何人都可以就任何已知问题提出建议吗?上面的“理论”有什么我遗漏的吗?
使用 jQuery 2.0。