홈>
단일 스레드 임에도 불구하고 자바 스크립트의 비동기 동작에 대해 연구하고 있었고이 코드에 대해 다음과 같은 주석을 달았습니다 :
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
관련 자료
- reactjs - 자바 스크립트 및 비동기 문제 (yandex지도 API로 거리 매트릭스 구축)
- arrays - async 및 await가 올바르게 작동하지 않습니다
- asynchronous - 비동기 JavaScript 및 I/O
- 약속 - 주사위 비동기 (javascript)
- svelte의 자바 스크립트에서 버튼 클릭시 비동기 함수를 호출하는 방법은 무엇입니까?
- reactjs - Javascript Async Await는 두 기능이 완료되기를 기다립니다
- node.js - Javascript Ajax 비동기를 사용한 데이터 업데이트 실패
- asynchronous - 자바 스크립트 비동기는 사이클과 어떻게 작동합니까?
- flask - 이 경우 Javascript 비동기 대기가 작동하지 않는 이유는 무엇입니까?
JavaScript에서는 모든 것이 함수입니다. 동기 함수와 비동기 함수 사이에는 차이가 없습니다. 유일한 차이점은 이러한 함수를 호출하는 방식입니다. 따라서 "sync"/ "async"는 쉽게 의사 소통 할 수있는 프로그래머를위한 추상적 개념입니다.
JavaScript의 실제 작동 방식 :
자바 스크립트에는 실행 대기중인 "기능"대기열이 있습니다. 새로운 "비동기 함수"를 작성할 때마다이 큐에 추가하십시오. 예를 들어, 당신이
setTimeout()
를 할 때 이런 일이 , 아약스 호출 또는 단순히 브라우저에 의해 트리거되는 "onClick"과 같은 DOM 이벤트입니다.JS에서 특정 함수가 실행되면 중단되지 않습니다. 완료 될 때까지 실행됩니다. 그 후에 만 런타임 (브라우저)이 대기열을 살펴보고 다음에 실행할 기능을 결정한 다음 호출을 마치고 대기합니다.
위의 예에서 브라우저는 현재 "bar"를 인쇄하는 기능을 실행하고 있습니다. 이 실행은 완료되기 전에 중단 될 수 없으므로 "bar"가 먼저 인쇄됩니다. 그러나 실행하는 동안 새로운 비동기 함수가 작성되어 실행 큐로 푸시됩니다. "bar"가 인쇄 된 후에 만 런타임이 대기열을보고 "foo"기능을 찾아서 실행합니다.
이것의 부작용은 오래 실행되는 작업입니다. 이러한 기능이 실행되는 동안 브라우저가 다른 기능을 수행 할 수 없습니다. 심지어 페이지를 렌더링/업데이트하지도 않습니다. 따라서 10 초 동안 실행되는 코드가 있으면 사용자는 기능이 완료 될 때까지 웹 사이트와 상호 작용할 수 없습니다. 그 이유는 마우스 동작, 클릭 및 스크롤 이벤트와 같은 모든 사용자 이벤트가 대기열에 있고 스레드가 장기 실행 작업을 완료 할 때까지 처리 할 수 없기 때문입니다.
JavaScript를 사용한 멀티 스레딩
HTML5를 사용하면 JavaScript는 이제 웹 워커를 사용하여 여러 스레드를 사용할 수 있습니다. 그러나 이것은 완전히 다른 주제 이며이 질문의 범위를 벗어납니다. 이론적으로 가능하다는 것을 기억하십시오.