2013-06-22 3 views
4

자바 스크립트의 setTimeout 함수로 인해 자바 스크립트에 대해 잘 아는 부분을 다시 평가하게되었습니다. 오늘 아침 일찍 나는이 같은 for 루프로 실행 : 내가 할 수있는이 코드를 기대했던JS의 setTimeout을 통한 스레딩/동시성 이해

for (i = 0; i < length; i++) { 
    setTimeout(executeOtherCode, 5000) 
} 

5 초 동안 executeOtherCode 기능, "잠"을 실행하고 다음 반복을 계속했다. 대신에 나는 executeOtherCode를 사용하여 동시에 길이를 실행했습니다.

제 생각에 setTimeout은 비동기 함수 호출입니다. 이 올바른지? 그러나 정규 함수를 실행하려면 1 분 걸리는 hugeFunction()을 호출 해 보겠습니다. 다음 함수는 함수가 반환 할 때까지 실행되지 않습니다. 맞습니까? 그렇다면 왜 다른 두 가지가 있습니까? 언어 디자인 선택에 불과합니까?

jQuery에서 getJSON과 같이 비동기 적으로 동작하는 다른 기능을 보아 왔습니다. 어떤 함수가 비동기식으로 정의 되었는가를 아는 것입니까, 아니면 그것을 식별 할 수있는 패턴이 있습니까? 그렇다면, 무엇?

+0

일반적으로 비동기 함수는 네트워크 또는 일종의 I/O 연산 (예 : HTML5의 새로운 IndexedDB 및 WebWorkers 기능의 일부 메소드)을 통해 데이터를 검색하는 것을 처리하는 함수입니다. 그 이외에는 식별 할 수있는 실제적인 일관된 방법이 없습니다. 당신은 당신이 사용하고있는 라이브러리에 대한 문서를보아야 만합니다. –

+1

_ "내가 얻은 것은 executeOtherCode와 동시에"_ - 아니야. 이 코드는'executeOtherCode()'가 5000ms 후에'length' 번 호출되도록 대기하며 그 동안 현재 블록이 계속됩니다. 각각의 타임 아웃은 가능한 한 나중에 5000ms 가까이 실행하지만 다른 JS는 이미 실행 중입니다. _ 때문에 각 스레드가 동시에 실행되지 않고 멀티 스레드되지 않습니다. 그것은 각자 사이에 눈에 띄는 지연이 없었기 때문에 동시 발생했습니다. – nnnnnn

답변

6

일반적으로 특별한 경우를 제외하고 - JavaScript는 동기식으로 순서대로 실행됩니다.

setTimeout(executeOtherCode, 5000) 

"5 초 후에 함수 executeOtherCode"이 표시됩니다. 그것은 루프를 계속 실행하고, 실행을 '차단'하지 않습니다.

5 초가 지나면 이벤트 루프는 타이머 (물론 length 타이머)가 설정되었음을 알게되고 실행합니다 (하나씩 차례대로).

함수가 서로 5 초 지연되도록하려면 마지막 함수가 완료된 후 5 초를 실행하도록 다음 함수에 지시해야합니다.이 패턴을 비동기식 세마포라고합니다.

엄지 손가락의 일반적인 규칙은 (자바 스크립트의 반응은 I 않는 경우/O가 비동기해야 AJAX 비동기 이유, 그건 (물론 스크립트 태그 주입과 같은 다른 HTTP 요청) 및 상호 작용 이벤트는 비동기이다 예를 들어 클릭 수에 대해서는 대기하지 않습니다. 타이머 (setTimeout 및 setInterval도 비동기입니다).

다른 모든 것은 동기식입니다.

이제 일부 기능은 을 사용하지만 다른 기능은 there is no silver bullet입니다. 문서를 깨끗하게 정리하십시오. 대부분의 비동기 함수에는 callOn 매개 변수 (예 : executeOtherCode의 첫 번째 매개 변수)가 있지만 일부 함수는 콜백을 허용하지만 비동기는 아닙니다.

+0

+1. 그리고 대부분의 JavaScript는 단일 스레드 방식으로 실행됩니다 (HTML5 WebWorkers 제외). –

관련 문제