>  기사  >  웹 프론트엔드  >  JavaScript의 동기화 및 비동기성

JavaScript의 동기화 및 비동기성

黄舟
黄舟원래의
2017-02-07 14:38:231090검색

JavaScript를 배우는 과정에서 동기화와 비동기성은 특히 초보자에게 매우 어려운 두 가지 개념입니다. 간단히 말해서 두 가지 이상의 일이 동시에 발생하는 경우를 동기화라고 하고, 동시에 발생하지 않는 경우를 비동기라고 합니다.

이 두 개념은 간단해 보이지만 실제로 이해하려면 많은 노력이 필요합니다. 어떤 상황이 동기적이고 어떤 상황이 비동기적인지 실제 작업을 통해 이해해야 합니다.

일반적인 JavaScript 함수는 동기식이라고 생각할 수도 있습니다. setTimeout()과 AJAX를 사용하면 동기식이라고 생각할 수도 있겠죠? 이 두 기능이 특정 시간에 비동기식일 수도 있다고 말하면 믿으시겠습니까?

이유를 명확하게 설명하려면 X씨의 도움이 필요합니다.

시나리오 1: Mr에게 할당된 작업입니다.

    2 그에게 연락할 수 있는 유일한 방법은 전화뿐이다.
  • 3 어떤 문제나 업무에 직면하더라도 Mr.X에게 도움을 요청하려면 그에게 전화해야 합니다.
  • 4 Mr X가 답변을 제공하거나 작업을 즉시 완료하고 완료 후 알려드립니다.
  • 5 아저씨의 도움으로
  • 이 과정에서 X씨와 당신이 이루는 것은 동기적 소통입니다.
  • 당신이 질문하면 그는 듣고 있고, 그가 대답하면 당신도 동시에 듣고 있습니다.

시나리오 2: X씨는 동시성을 좋아하지 않습니다.

왜냐하면 Mr. 그래서 그 사람에게 전화하면 항상 통화 중입니다. 당신은 그에게 질문을 할 수 없고, 그도 당신을 대신해 대답할 수 없습니다.

JavaScript의 동기화 및 비동기성그렇다면 X씨는 이 상황에 어떻게 대처할 수 있을까요?

1 Mr X는 보조 Mr M을 고용하고 자동 응답기를 갖추고 있습니다.

    2 Mr M의 임무는 자동 응답기의 메시지를 듣고 질문을 요약하여 X씨에게 전달하는 것입니다.
  • 3 이렇게 전화하면 X씨가 다시 전화를 하더군요.
  • 4 다른 사람들이 묻는 질문에 답한 후 Mr X가 다시 전화를 걸어 해결책을 알려줄 것입니다.
  • 그렇다면 이 프로세스가 동기 통신인가요, 비동기 통신인가요?
  • 둘 다라고 할 수 있다. 자동 응답기에 메시지를 남기면 X씨는 듣고 있지 않으므로 이는 비동기 통신입니다.

  • 그런데 그 사람이 전화를 하면 두 사람이 동기적으로 소통을 하고 있는 것 같아요.

이제 동기식 통신과 비동기식 통신을 이해해야 합니다. 이제 JavaScript의 동기화와 비동기성에 대해 이야기해 보겠습니다.

JavaScript - 비동기 프로그래밍 언어

누군가 JavaScript가 비동기 언어라고 말한다면, 그 의미는 일반적으로 JavaScript를 사용할 때 메시지가 필요하다는 것입니다. 전화를 걸어도 통화 중 신호음이 들리지 않습니다.

JavaScript의 함수 호출은 직접 발생하지 않으며 메시지를 통해 수행됩니다.

JavaScript는 새로 들어오는 메시지(또는 이벤트)가 임시로 저장되는 메시지 대기열을 사용합니다. 이벤트 루프는 이러한 메시지를 지속적으로 처리하고 이를 호출 스택으로 보냅니다. 여기서 해당 메시지 함수는 실행을 위해 프레임(함수의 독립 및 종속 변수)에 쌓입니다.

호출 스택에는 첫 번째 호출된 함수의 프레임뿐만 아니라 이 함수 위에 중첩된 호출을 통해 호출된 다른 함수의 프레임도 포함됩니다.

메시지가 대기열에 추가되면 호출 스택의 이전 메시지 프레임이 처리될 때까지 기다립니다. 이전 메시지가 처리된 후 이벤트 루프는 이를 큐에서 제거한 다음 현재 메시지의 해당 프레임을 호출 스택에 추가합니다.

이 메시지는 다시 대기를 시작하며 호출 스택에 해당 프레임을 지운 다음 대기열에서 제거하도록 지시합니다.

다음 코드를 보세요:

 function foo(){}function bar(){  foo();
}function baz(){  bar();
}
baz();

여기서 실행되는 함수는 코드 세그먼트의 마지막 줄에 있는 baz()입니다. 이벤트 루프가 선택하면 호출 스택은 실행 중에 baz(), bar() 및 foo()에 대한 프레임을 스태킹하기 시작합니다.

JavaScript의 동기화 및 비동기성

함수 실행이 완료된 후 해당 프레임은 호출 스택에서 제거되고 메시지는 baz()가 실행될 때까지 대기열에서 계속 대기합니다. 스택이 배출되었습니다.

JavaScript의 동기화 및 비동기성


JavaScript의 함수 호출은 직접 수행되지 않고 메시지를 통해 수행된다는 점을 기억하세요.

구체적인 비동기 방식은 무엇인가요?

지금까지 특별히 비동기 메서드로 표시되는 setTimeout() 및 AJAX와 같은 일부 API를 접했습니다. 무슨 일이야?

매우 중요한 것 중 하나는 어떤 일이 동기적으로 발생하고 어떤 일이 비동기적으로 발생하는지 이해하는 것입니다. 이벤트와 이벤트 루프의 도움으로 JavaScript는 메시지를 비동기적으로 처리할 수 있지만 이것이 JavaScript의 모든 것이 비동기적이라는 의미는 아닙니다.

앞서 호출 스택이 해당 프레임을 지울 때까지 메시지는 대기열을 떠나지 않는다고 말했습니다. 예를 들어, 답을 얻을 때까지 영화를 보러 나가지 않는 것과 같습니다. 이때 일어나는 일은 동기적입니다. 작업이 완료되기를 기다리며 작업이 완료되는 것을 본 후에야 자리를 떠납니다. 자신의 눈.

위 내용은 JavaScript의 동기화 및 비동기 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.