>

단일 스레드 임에도 불구하고 자바 스크립트의 비동기 동작에 대해 연구하고 있었고이 코드에 대해 다음과 같은 주석을 달았습니다 :

request(..., function (error, response, body)  
    console.log('foo);  
});  
    callAComputationallyIntensiveSynchronousFunctionThatTakesSixHoursToExecute();  
console.log('bar'); 

와이즈 비즈

동기 함수 실행이 이벤트보다 우선 순위가 높다는 것을 이해하지만 'foo'전에 'bar'가 인쇄되는 이유를 이해하지 못합니다. 내 독서에서 비동기 호출을 수행 한 후 응답이 준비되기 전에 데드 타임을 채우려면 준비가 될 때까지 다른 코드 줄을 처리하고 응답을 위해 콜백 함수를 실행해야합니다. 그 후에는 코드 처리 등으로 돌아갑니다.

그러나 위의 예는 동기 함수 실행이 끝나기 훨씬 전에 응답이 준비 되더라도 계속 진행되어 다음 코드 줄을 실행한다는 것을 나타냅니다. 왜 그런가요?

'bar' will still come before 'foo' because Javascript always finishes the currently executing function first. An event will never interrupt a function.


  • 답변 # 1

    JavaScript에서는 모든 것이 함수입니다. 동기 함수와 비동기 함수 사이에는 차이가 없습니다. 유일한 차이점은 이러한 함수를 호출하는 방식입니다. 따라서 "sync"/ "async"는 쉽게 의사 소통 할 수있는 프로그래머를위한 추상적 개념입니다.

    JavaScript의 실제 작동 방식 :

    자바 스크립트에는 실행 대기중인 "기능"대기열이 있습니다. 새로운 "비동기 함수"를 작성할 때마다이 큐에 추가하십시오. 예를 들어, 당신이 setTimeout() 를 할 때 이런 일이 , 아약스 호출 또는 단순히 브라우저에 의해 트리거되는 "onClick"과 같은 DOM 이벤트입니다.

    JS에서 특정 함수가 실행되면 중단되지 않습니다. 완료 될 때까지 실행됩니다. 그 후에 만 ​​런타임 (브라우저)이 대기열을 살펴보고 다음에 실행할 기능을 결정한 다음 호출을 마치고 대기합니다.

    위의 예에서 브라우저는 현재 "bar"를 인쇄하는 기능을 실행하고 있습니다. 이 실행은 완료되기 전에 중단 될 수 없으므로 "bar"가 먼저 인쇄됩니다. 그러나 실행하는 동안 새로운 비동기 함수가 작성되어 실행 큐로 푸시됩니다. "bar"가 인쇄 된 후에 만 ​​런타임이 대기열을보고 "foo"기능을 찾아서 실행합니다.

    이것의 부작용은 오래 실행되는 작업입니다. 이러한 기능이 실행되는 동안 브라우저가 다른 기능을 수행 할 수 없습니다. 심지어 페이지를 렌더링/업데이트하지도 않습니다. 따라서 10 초 동안 실행되는 코드가 있으면 사용자는 기능이 완료 될 때까지 웹 사이트와 상호 작용할 수 없습니다. 그 이유는 마우스 동작, 클릭 및 스크롤 이벤트와 같은 모든 사용자 이벤트가 대기열에 있고 스레드가 장기 실행 작업을 완료 할 때까지 처리 할 수 ​​없기 때문입니다.

    JavaScript를 사용한 멀티 스레딩

    HTML5를 사용하면 JavaScript는 이제 웹 워커를 사용하여 여러 스레드를 사용할 수 있습니다. 그러나 이것은 완전히 다른 주제 이며이 질문의 범위를 벗어납니다. 이론적으로 가능하다는 것을 기억하십시오.

  • 이전 java를 사용하여 Google 드라이브에 폴더를 만드는 방법
  • 다음 jquery - 더 긴 텍스트를위한 Div 확장 버튼