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的元素。我没有意识到这一点,所以第一个没有兄弟姐妹,导致错误。我一直在看第二个元素。
但是,我确实在这个过程中学到了一些东西,所以感谢您花时间回答。
答案 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();
}