2017-11-26 1 views
2

이 질문의 제목이 약간 혼란 스럽다면 죄송합니다.이 말을 찾아내는 데 어려움을 겪고있었습니다.비동기 함수가 수행 된 후 코드가 얼마나 더 실행됩니까

기본적으로 비동기 함수가 호출 될 때 비동기 함수가 다른 함수, 개체 또는 파일에서 호출 된 경우 코드가 얼마나 더 실행될 것입니다. 예를 들어 :

function func1() { 
    // async function 1 
    // async function 2 
} 

function func2() { 
    // more code 
} 

func1(); 
func2(); 

는의 그것을 실행하는 데 시간이 오래 걸릴 안에 우리가 func1() 비동기 기능을 모두 실행한다고 가정 해 봅시다. func1()의 콘텐츠가 아직 실행 중이거나 func1()이 완료 될 때까지 차단하여 func2()으로 계속 진행할 때까지 func2()으로 계속 진행할 예정입니까?

+0

첫 번째 함수 ('func1')가 비동기식 (HTTP 요청이라고 가정 해 봅시다)이면 두 번째 함수 ('func2')가 실행됩니다. 'func1' 응답이 돌아 왔는지 안했는지 상관하지 않습니다.'promise'를 사용하거나'func1'에서'func1'을 호출해야합니다. – M98

+0

그래서 기본적으로 당신은 부탁하고 있습니다. means._ – CBroe

+0

예, * 비동기 * 기능의 전체적인 요점은 작업이 나중에 완료되는 동안 코드가 즉시 실행을 다시 시작한다는 것입니다. – Bergi

답변

0

비동기 콜백은 버튼 클릭 이벤트와 비슷한 최상위 이벤트이며 실행중인 다른 스크립트가없는 경우에만 시작할 수 있습니다.

콜 스택이 비어 있고 (샘플이 보여주는 "전역 사용자 코드"포함) 스크립트 엔진 자체가 제어를받을 때까지 실행이 계속됩니다. 따라서 func1()func2()은 콜백이 실행되기 전에 완료됩니다.

참고 : "비동기"함수에 동기 및 비동기 코드 분기가 모두있는 경우 해당 함수의 콜백을 호출 함수로 반환하지 않고 동 기적으로 실행할 수 있습니다 (일반 콜백 또는 약속을 포함한 다른 형식).

2

JavaScript는 단일 스레드, 비 차단 및 비동기식 언어입니다. JavaScript에는 호출 스택, 이벤트 루프 및 콜백 대기열이 있습니다. 단어는 this 비디오에서 직접 가져옵니다. Javascript는 v8 엔진 (chrome), JavaScript 콜 스택 및 힙을 제공하는 스파이더 원숭이 (firefox)에서 작동합니다. v8 또는 스파이더 원숭이는 Javascript에 호출 스택을 제공하므로 함수가 호출 될 때마다 런타임의 호출 스택 (우리의 경우 브라우저, 노드가 설치되어있는 경우 로컬)에 에 저장됩니다. 브라우저는 setTimeOut, XMLHttpRequestDOM과 같은 자바 스크립트에 웹 API도 제공합니다. 그림 삽화는 이와 같습니다. (출처 내가 태그 한 같은 동영상입니다.)

enter image description here

자바 스크립트는 단일 스레드을하고 그것은 하나의 호출 스택을 가지고로 한 번에 하나 개의 기능을 수행 할 수 있음을 의미합니다. 따라서 비동기 코드 (func1 내부)가 실행될 때마다 브라우저에서 제공하는 webAPI를 통해 실행됩니다. 콜백 대기열의 역할이 여기에옵니다. 비동기 코드의 결과가 실행될 때마다 콜백 큐에 저장되고 스택이 비게 될 때까지 기다립니다 (이벤트 구동 프로그래밍). 스택이 비어 있음을 알 때마다 콜백 큐의 함수가 실행되기 시작합니다.

귀하의 경우, 귀하는 func1으로 전화하고 있습니다. 일부 비동기 코드에서 작동하지만 현재 func1이 스택에 있습니다. 비동기 코드가 완료되고 스택이 비어있는 것으로 보이는 경우 먼저 비동기 코드를 실행 한 다음 func2을 실행하지만 async 코드가 완료되지 않은 경우 func2 코드가 실행되고 콜백 큐가 스택을 기다립니다 비우기. 이 경우 흐름은 func1 --> func2 --> async code이됩니다.

타이밍의 문제입니다.비동기 코드의 경우 코드가 반환되어 콜백 대기열에서 대기하고 있으면 스택이 비어있는 것을 확인하자마자 callbacks (.then 또는 setTimeOut의 콜백) 실행을 시작합니다. 그 통찰력과 JS에서의 이벤트 루프에 대한 비디오. 내가 뭔가를 놓치고 있다면 아무나 자유롭게이 답변을 편집하거나 수정 제안을 보내주십시오.

1

JavaScript는 단일 스레드이므로 문자 그대로 같은 시간에 아무 것도 실행할 수 없습니다. 코드가 비동기 성질을 갖는다면 그것은 미래의 미래에 실행된다는 것을 의미합니다. 그것이 코드에 의존하기 때문에 나는 알았다고 말했다. 예를 들어 브라우저가 서버로부터 응답을 받으면 Ajax 호출을위한 비동기 코드가 실행됩니다.

즉, 비동기 코드는 선언 순간에는 실행되지 않지만 다음 이벤트 루프에는 실행되지 않습니다. 또한 현재 실행을 차단하지 않습니다. 자바 스크립트에서는 실행 코드가 방해받지 않습니다. 그냥 모든 라인을 통과합니다.

예제로 돌아가서 func1에 동기화 차단 코드가 없으면 func2가 지연없이 즉시 실행됩니다.

관련 문제