동기 및 비동기 JavaScript 이해 - 1 부
동기식 과 비동기식 특히 초보자를위한 JavaScript의 혼란스러운 개념입니다. 두 가지 이상이 있습니다. 동기식의 그들 동시에 일어난다. (동기화 상태), 비동기식 (동기화되지 않음).
이러한 정의는 쉽게 받아 들일 수 있지만 사실 보이기보다 복잡합니다. 우리는 고려할 필요가있다. 정확히 일치하는 것, 과 ~하지 않는 것.
아마 전화 할거야. 표준
자바 스크립트 동기 기능, 맞죠? 그리고 그것이 뭔가라면 setTimeout ()
또는 AJAX를 사용하고 있다면, 비동기식이라고 말할 것인가? 내가 너에게 말하면 어떻게 될까? 양자 모두 비동기 적이다.?
설명하기 왜, 도움을 받으려면 Mr X 씨를 찾아야합니다..
시나리오 1 - Mr X가 동시성을 시험 중입니다.
다음은 설정입니다.
- X 씨는 어려운 질문에 대답 할 수있는 사람이며, 요청 된 작업을 수행합니다..
- 연락을 취하는 유일한 방법은 전화 통화입니다..
- X 씨의 도움을 청하기 위해서 당신이 가진 질문이나 임무는 무엇이든합니다. 너는 그를 부른다..
- X 씨가 답변을 주거나 작업을 완료합니다. 곧, 너에게 알린다. 끝났다.
- 당신은 수신기 느낌의 콘텐츠를 내려 놓고 영화를 보러 나가야합니다..
방금 한 일은 동기식 (앞뒤) 통신 X 씨와 함께. 그는 당신이 그에게 당신의 질문을하고있는 것을 듣고, 당신이 대답 할 때 귀를 기울였습니다..
시나리오 2 - Mr X는 동시성에 만족하지 않습니다.
X 씨가 매우 효율적이어서 그는 더 많은 전화를 받기 시작합니다. 그럼 전화 할 때 무슨 일이 일어 날까? 그는 이미 바쁘다. 다른 사람과 얘기하고 있니? 당신이 그에게 당신의 질문을 물을 수 없을 것입니다 - 당신이 전화를 무료로받을 때까지. 바쁘신가요?.
X 씨가이 문제를 해결하기 위해 할 수있는 일은 무엇입니까??
직접 전화를받는 대신 :
- Mr X는 새로운 사람 M을 고용하고 발신자에게 자동 응답기를 제공합니다. 메시지를 남기려면.
- M 씨의 직업은 메시지를 전하다 자동 응답기에서 X 씨에게 일단 X 씨가 모든 이전 메시지 처리를 완전히 끝냈다는 것을 알게되면 이미 자유롭게 새로운 것을 가져 가라..
- 그래서 지금 전화하면 바쁜 음색을 듣지 않고 X 씨에게 메시지를 남기고 그가 너에게 다시 전화 할 때까지 기다린다. (영화 시간은 아직 없음).
- X 씨가 당신 앞에받은 모든 대기 메시지를 끝내면 문제를 조사 할 것입니다. 다시 전화 해. 당신에게 답을주기 위해.
이제 여기에 질문이 있습니다. 동기식 또는 비동기식?
섞여있어. 메시지를 남기 셨을 때, X 씨는 그것에 대해 듣지 않았기 때문에 네 번째 통신은 비동기식이었습니다..
그러나 그가 대답했을 때, 너 거기 듣고 있었어., 어느 반환 통신을 동기로 만든다..
지금까지 의사 소통 측면에서 동시성이 어떻게 감지되는지 더 잘 이해했으면합니다. JavaScript를 가져올 시간.
JavaScript - 비동기 프로그래밍 언어
누군가가 JavaScript 비동기 레이블을 붙일 때 일반적으로 언급하는 것은 메시지 남기기 그것을 위해, 그리고 통화가 차단되지 않았습니다. 바쁜 소리와 함께.
함수 호출은 다음과 같습니다. JavaScript에서 직접 처리하지 마라., 그들은 문자 그대로 끝났다. 메시지를 통해.
자바 스크립트는 메시지 대기열 수신 메시지 (또는 이벤트)가 보관되는 곳. 안 이벤트 루프 (메시지 디스패처)는 이러한 메시지를 순차적으로 호출 스택 여기서 메시지의 해당 기능은 다음과 같습니다. 프레임으로 쌓인 실행을위한 함수 인자 (변수와 변수).
호출 스택은 호출되는 초기 함수의 프레임과 호출 된 함수의 다른 프레임을 보유합니다. 중첩 된 호출을 통해 그 위에 .
메시지가 대기열에 참여하면 호출 스택이 대기 할 때까지 기다립니다. 이전 메시지의 모든 프레임이 비어 있음, 이벤트 루프 일 때, 이벤트 루프 이전 메시지를 대기열에서 제외합니다., 현재 메시지의 해당 프레임을 호출 스택에 추가합니다.
호출 스택이 될 때까지 메시지가 다시 대기합니다. 해당 프레임이 비어 있음 (즉, 스택 된 모든 함수의 실행이 끝난 경우) 대기열에서 제외됩니다.
다음 코드를 고려하십시오.
function foo () function bar () foo (); function baz () bar (); baz ();
실행중인 기능은 다음과 같습니다. baz ()
(코드 스 니펫의 마지막 행에 있음). 대기열에 메시지가 추가됩니다., 이벤트 루프가이를 선택하면 호출 스택 스태킹 프레임 시작 ...에 대한 baz ()
, 바()
, 과 foo ()
관련 집행 지점에서.
함수의 실행이 하나씩 완료되면 해당 프레임이 호출 스택에서 제거됨, 메시지는 대기열에서 여전히 대기 중이다., ...까지 baz ()
스택에서 터진다..
함수 호출은 다음과 같습니다. JavaScript에서 직접 처리하지 마라., 끝났어. 메시지를 통해. 따라서 누군가가 JavaScript 자체가 비동기 프로그래밍 언어라고 말하는 것을들을 때마다 내장 함수에 대해 이야기하고 있다고 가정합니다. “자동 응답기”, 메시지를 자유롭게 남길 수있는 방법.
그러나 특정 비동기 메소드는 어떤가??
지금까지는 API에 대해 언급하지 않았습니다. setTimeout ()
그리고 AJAX, 그것들은 구체적으로 비동기라고합니다.. 왜 그런가요??
동기 또는 비동기가 정확히 무엇인지를 이해하는 것이 중요합니다. JavaScript는 이벤트 및 이벤트 루프의 도움으로 연습 할 수 있습니다. 메시지 비동기 처리, 하지만 그건 의미하지는 않는다. 모두 자바 스크립트에서 비동기입니다..
기억해두면, 호출 스택이 생길 때까지 메시지가 남기지 않았다고 말씀 드렸습니다. 해당 프레임이 비어 있음, 네가 네 대답을 얻을 때까지 네가 영화에 나가지 않은 것처럼 동기적인, 너 기다리고있어. 과제가 완료 될 때까지, 너는 해답을 얻는다..
기다리는 모든 시나리오에서 이상적이지는 않다.. 기다리는 대신 메시지를 남긴 후에 영화를 떠날 수 있다면 어떨까요? 함수가 폐기 (호출 스택 비우기) 할 수 있고 함수의 태스크가 완료되기 전에도 메시지의 대기열을 해제 할 수 있다면 어떨까요? 비동기로 코드를 실행할 수 있다면 어떨까요??
여기에는 다음과 같은 API가 있습니다. setTimeout ()
그리고 AJAX가 그림에 올랐고, 그들이하는 일은 ... 계속 기다리십시오,이 기사의 두 번째 부분에서 볼 수있는 X 씨에게 돌아 가지 않고서는 설명 할 수 없습니다. 계속 지켜봐주십시오..