0

编辑- 脚本文件的 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.VARIABLENAMEor 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。


  1. 我编写了一个 jQuery 插件,与大多数插件一样,它可以在多个(即一组)元素上执行。

  2. this.each(function(i,el){ });函数部分,我创建了另一个对象类型的新实例(与 jQuery 无关)并调用它的“Init”方法。

  3. 我希望使用 .each 循环,在完全执行 init 方法,它将循环到下一个实例。

  4. 我没有在任何地方使用任何异步(AJAX / 计时器)。

  5. 总是在“jQuery.fadeIn”或类似的东西上使用回调。

问题

Init 方法实际上是并行调用的。在调用下一个之前,它们没有完成执行。

任何人都可以就任何已知问题提出建议吗?上面的“理论”有什么我遗漏的吗?

使用 jQuery 2.0。

4

1 回答 1

2

尝试将for循环替换为:

var i = 0,
    l = window.JRTE_INSTANCES.length;
(function initloop() {
    if (i < l) window.JRTE_INSTANCES[i].Init(initloop);
    i++;
}());

这将通过调用启动 init 循环window.JRTE_INSTANCES[0].Init。传递的initloopas 回调将在结束时再次执行,从下一个Init开始另一个,依此类推,直到它遍历所有实例。Initi

这是一个更实用的异步演示,使用与上面非常相似的结构:Fiddle

于 2013-04-25T20:53:36.390 回答