2011-08-02 4 views
2

jQuery의 each() 함수가 비 블로킹입니까?jQuery each() non-blocking?

아래 예에서 "각 테스트"가 먼저 기록되지만 각 테스트에서 "각각의 테스트"가 먼저 기록됩니다.

이렇게하면 오류가 반환되기 전에 루프가 본문 (때로는 문서) 요소까지 실행됩니다.

나는 둘 중 하나의 요소 (firstp와 lastp)가 형제 인 경우에는 그 둘을 감싸려고하고있다.

하지만 each() 함수의 성능과 non-blocking인지 궁금합니다.

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는 형제를 가지므로 각각의 형제가 입력되고 "각각의 테스트"가 "각 테스트"후에 인쇄됩니다.

난 당신이 뭔가에 코드를 변경 한 경우에는 콘솔에서 적절한 행동을 볼 것이라 생각합니다, 그래서 당신은 볼 수있는 루프가에있는 반복 :

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

내 생각은 while 루프가 firstp.siblings()을 시작할 때 가 비어 있고 "test out of each"을 기록한 다음 firstPfirstp.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

흠, 네 말이 맞아, 나는 그곳에 진실을 말하려는 것이 아니야, 거짓말이야. –