2011-08-02 167 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

呃,你說得對,我並不是故意在那裏回到真實,我的意思是假的。 –