2

내가 좋아하는 JS 코드를 볼 :자바 스크립트 이벤트는 언제 실행됩니까?

 socket = new WebSocket(server); 

     socket.onopen = function (evt) 
     { 
       // STUFF 
     }; 

임 항상 약간의 혼란. 다른 언어로 그와 비슷한 것을 쓴다면, onopen 이벤트 핸들러는 server에 대한 연결이 이미 설정된 후에 바인드되어 onopen 이벤트가 누락 될 수 있습니다. Javascript 인터프리터가 첫 번째 행을 비동기 적으로 실행하더라도 두 번째 행이 너무 늦을 가능성은 여전히 ​​남아 있습니다.

 WebSocket socket = new WebSocket(); 

     socket.onopen = new EventHandler<EventArgs>(Open); 

     socket.Connect(server); 

답변

1

대부분의 다른 언어와는 달리, 자바 스크립트가 엄격 단일 스레드입니다 :

왜 C#에서 (예를 들어) 그것으로 자바 스크립트에서 위의 코드를 실행 잘 작성해야 않지만.
코드가 실행되는 동안에는 아무 것도 일어나지 않습니다.

onopen 제어가 이벤트 루프로 복귀 할 때까지 (해당 코드의 동기 부분이 완료된 후에) 실행되지 않아야합니다.

비동기 이벤트 (이 경우 소켓)에 대한 응답으로 onopen이 발생하므로이 사실에 유의하십시오.
동 기적으로 발생 된 경우에는 그렇지 않습니다. 이 문제를 해결하기 위해이 패턴과 함께 사용 된 이벤트를 동 기적으로 발생시키는 코드는 process.nextTick에서 비동기 적으로 이벤트를 발생시켜야합니다.

+0

단일 스레드가 이벤트를 즉시 실행할 수 없다는 것을 의미하지는 않지만, C#과 마찬가지로 동일한 스레드에서 호출 할 수 있습니다. 하지만 코드가 유휴 상태가 될 때까지 이벤트가 지연된다고 제안하는 것 같습니다. 재미있는 .. 그게 많이 설명 할 수 있습니다. – Muis

+0

@ Joshua : C# 소켓 클래스는 스레드 풀 (또는 IO 완료 포트 스레드)에서 이벤트를 발생시킬 가능성이 큽니다. Node.js는 할 수 없습니다. – SLaks

+0

예; Javascript의 비동기 액션 ('setTimeout' 포함)은 코드가 실행되는 동안에는 일어나지 않습니다. 이것은 단일 스레드 특성의 직접적인 결과입니다. – SLaks

0

DIY를 버전은 블랙 박스 기본 기능을보다 더 쉽게 시각화 할 수 있습니다 :이 새로운 소켓 (서버)가 왜 작동하는지보다 왜 작동

function Sock(url){ 
    this.init=function(){ 
     this.url=url; 
     this.onopen.call(this, {name:"open", url:url, dt: +new Date}); 
    } .bind(this); 

    setTimeout(this.init, 0); 

} 

socket = new Sock("123"); 

socket.onopen = function (evt) { 
      alert(JSON.stringify(evt, null, "\t")); 
}; 

그것은 훨씬 더 명백해야한다 ...