jQuery each()非阻塞?

时间:2011-08-02 02:14:00

标签: jquery

jQuery的each()函数是否是非阻塞的?

在下面的示例中,我希望首先记录“每个测试”,但在每个测试中,首先记录“每个测试”。

因此,这会导致循环在返回错误之前运行到正文(有时是文档)元素。

我只是想让一个共同的父包装,或者如果这两个元素(firstp和lastp)是兄弟姐妹,那么将它们包起来。

但是,我很好奇每个()函数的性能以及它是否是非阻塞的。

while(firstp[0] !== lastp[0]){
        //If parents are siblings, this will do for wrapping.
        var isS = false;
            firstp.siblings().each( function(index, el){
                console.log("test in each");
                if(jQuery(el)[0] === lastp[0]){
                    isS = true;
                    return true;
                }
            });
            console.log("test out of each");
        if(isS === true){ break; }
        firstp = firstp.parent();
        lastp = lastp.parent();
    }

编辑:

对不起伙计们。这是一个误报。保罗是对的。我的HTML实际上有两个匹配firstp的元素。我没有意识到这一点,所以第一个没有兄弟姐妹,导致错误。我一直在看第二个元素。

但是,我确实在这个过程中学到了一些东西,所以感谢您花时间回答。

4 个答案:

答案 0 :(得分:3)

这里的“非阻塞”是什么意思? Javascript通常在一个线程中运行,所以......一切都在阻塞。 (XMLHttpRequests被传递给浏览器的各个部分,因此不计算。)事件/动画队列略有改变(在回调调用与用户指定的语句顺序分离),但两者都没有生效这里。

如果您询问它是否异步运行,以便在调用each()调用之后的代码之前不必处理所有选定元素,则答案应为“否”。

但这并不能解释你所看到的结果。我建议也许,因为你有嵌套循环,你可能会错误地解释控制台日志条目。我建议在控制台日志消息中添加一个迭代计数器。

答案 1 :(得分:3)

.each()是同步的。我猜是这样的:

在你的while循环的第一次迭代中,firstp没有兄弟,所以每个迭代的对象都是空的,并且“test out of each”是记录的第一个东西。然后在第二次迭代中,firstp有兄弟姐妹,所以它进入每个兄弟姐妹,然后你会在“测试每个”之后立即看到“在每个中测试”。

如果您将代码更改为此类代码,我认为您将从控制台中看到正确的行为,因此您可以看到循环的迭代次数:

var i = 1;
while(firstp[0] !== lastp[0]){
        //If parents are siblings, this will do for wrapping.

        var isS = false;
            firstp.siblings().each( function(index, el){
                console.log(i+": test in each ("+index+")");
                if(jQuery(el)[0] === lastp[0]){
                    isS = true;
                    return true;
                }
            });
            console.log(i+": test out of each"));
            i++;
        if(isS === true){ break; }
        firstp = firstp.parent();
        lastp = lastp.parent();
}

答案 2 :(得分:1)

我认为当while循环开始firstp.siblings()为空且记录"test out of each"然后firstP设置为firstp.parent();时可能会产生一些结果记录内部消息。请调试,看看你在第一次迭代中得到了什么

答案 3 :(得分:1)

当你执行return true时,是否意味着要超越each次迭代?如果是这样,我认为应该是return false。我认为return true没有效果。

此外,您可以将代码更改为以下内容:

while(firstp[0] !== lastp[0]){
    //If parents are siblings, this will do for wrapping.
    var isS = false;
        firstp.siblings().each( function(index, el){
            console.log("test in each");
            isS = jQuery(el)[0] === lastp[0];
            return isS;
        });
        console.log("test out of each");
    if(isS === true){ break; }
    firstp = firstp.parent();
    lastp = lastp.parent();
}