JavaScript는 단일 스레드, 비 차단 및 비동기식 언어입니다. JavaScript에는 호출 스택, 이벤트 루프 및 콜백 대기열이 있습니다. 단어는 this 비디오에서 직접 가져옵니다. Javascript는 v8 엔진 (chrome), JavaScript 콜 스택 및 힙을 제공하는 스파이더 원숭이 (firefox)에서 작동합니다. v8 또는 스파이더 원숭이는 Javascript에 호출 스택을 제공하므로 함수가 호출 될 때마다 런타임의 호출 스택 (우리의 경우 브라우저, 노드가 설치되어있는 경우 로컬)에 에 저장됩니다. 브라우저는 setTimeOut
, XMLHttpRequest
및 DOM
과 같은 자바 스크립트에 웹 API도 제공합니다. 그림 삽화는 이와 같습니다. (출처 내가 태그 한 같은 동영상입니다.)
자바 스크립트는 단일 스레드을하고 그것은 하나의 호출 스택을 가지고로 한 번에 하나 개의 기능을 수행 할 수 있음을 의미합니다. 따라서 비동기 코드 (func1 내부)가 실행될 때마다 브라우저에서 제공하는 webAPI를 통해 실행됩니다. 콜백 대기열의 역할이 여기에옵니다. 비동기 코드의 결과가 실행될 때마다 콜백 큐에 저장되고 스택이 비게 될 때까지 기다립니다 (이벤트 구동 프로그래밍). 스택이 비어 있음을 알 때마다 콜백 큐의 함수가 실행되기 시작합니다.
귀하의 경우, 귀하는 func1
으로 전화하고 있습니다. 일부 비동기 코드에서 작동하지만 현재 func1
이 스택에 있습니다. 비동기 코드가 완료되고 스택이 비어있는 것으로 보이는 경우 먼저 비동기 코드를 실행 한 다음 func2
을 실행하지만 async
코드가 완료되지 않은 경우 func2
코드가 실행되고 콜백 큐가 스택을 기다립니다 비우기. 이 경우 흐름은 func1 --> func2 --> async code
이됩니다.
타이밍의 문제입니다.비동기 코드의 경우 코드가 반환되어 콜백 대기열에서 대기하고 있으면 스택이 비어있는 것을 확인하자마자 callbacks
(.then 또는 setTimeOut의 콜백) 실행을 시작합니다. 그 통찰력과 JS에서의 이벤트 루프에 대한 비디오. 내가 뭔가를 놓치고 있다면 아무나 자유롭게이 답변을 편집하거나 수정 제안을 보내주십시오.
첫 번째 함수 ('func1')가 비동기식 (HTTP 요청이라고 가정 해 봅시다)이면 두 번째 함수 ('func2')가 실행됩니다. 'func1' 응답이 돌아 왔는지 안했는지 상관하지 않습니다.'promise'를 사용하거나'func1'에서'func1'을 호출해야합니다. – M98
그래서 기본적으로 당신은 부탁하고 있습니다. means._ – CBroe
예, * 비동기 * 기능의 전체적인 요점은 작업이 나중에 완료되는 동안 코드가 즉시 실행을 다시 시작한다는 것입니다. – Bergi