2011-08-02 56 views
2

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

在下面的例子中,我预计“每个测试”都会先记录下来,但是在每个测试中,“每个测试”都会先记录下来。

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

我只是试图让一个共同的家长包装,或者如果两个元素(firstp和lastp)是兄弟姐妹,然后包装这些。

但是,我主要关心each()函数的性能以及它是否是非阻塞的。

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

当“测试出每一个”被记录,你也看到登录控制台“在每个测试”? – ShankarSangoli

+0

@Shankar是的,这两个文本都被记录下来,只是没有按我期望的顺序。也许我错过了一些明显的东西。 –

+0

@Senica:当你的控制台日志消息在他们的文本中没有显示任何明显的关系时,我不认为你可以对“命令”做出断言。消息可以从外部循环中的不同迭代中打印出来,你永远不会知道。 –

回答

3

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

在while循环的第一次迭代中,firstp没有兄弟节点,所以每个迭代的对象都是空的,并且“测试每个节点”是第一件事情。然后在第二次迭代中firstp有兄弟姐妹,所以它进入每一个,你立即看到“测试每个”打印后“测试每个”。

我想你会看到从控制台的正确的行为,如果你改变你的代码,这样的事情,所以你可以看到什么迭代的环路上:当while循环开始firstp.siblings()

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(); 
} 
+0

对不起。这是一场虚惊。保罗是对的。我的HTML实际上有两个匹配firstp的元素。我没有意识到这一点,所以第一个没有兄弟姐妹。我一直在看第二个元素。 –

3

这是什么意思,“无阻塞”? Javascript通常运行在一个单独的线程中,所以......一切都被阻塞了。 (XMLHttpRequests被移交给浏览器的不同部分,因此不计数。)事件/动画队列略有改变(因为回调调用与用户指定的语句顺序是分开的),但两者都不起作用这里。

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

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

1

我想是空的,它会记录"test out of each",然后firstP设置为firstp.parent();,这可能会给出一些结果,以便记录内部消息。请调试,看看你在第一次迭代中得到什么

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(); 
} 
+0

呃,你说得对,我并不是故意在那里回到真实,我的意思是假的。 –