JavaScript의 비동기 프로그래밍은 점차 모든 사람이 받아 들여졌습니다. 이전에는 일반적으로 사람들은 일반적으로 콜백 중첩, Settimeout, SetInterval 등을 통해이를 구현했습니다. 코드는 매우 직관적이지 않으며 전체 코드 로직을 보지 않고는 빠르게 이해하기가 어렵습니다. JavaScript의 비동기 기능에는 I/O 함수 (AJAX, PostMessage, IMG Load, 스크립트로드 등), 타이밍 기능 (Settimeout, SetInterval) 등이 포함됩니다.
우리는 모두 이것에 익숙합니다. 복잡한 응용 분야에서는 종종 여러 층의 중첩이 있으며 일부 단계가 완료되지 않았으며 프로그램 예외가 발생한다고 생각합니다. 가장 간단한 예는 다음과 같습니다. 예를 들어, 노드를 DOM에 주입하면 노드가 주입되고 노드를 작동 할 때까지 기다려야합니다. 많은 노드가 주입되면 종종 시간을 파악하기가 어렵습니다. 타사 API의 데이터에 의존 할 코드가있는 경우. API 응답이 어떻게 지연되는지 알 수 없으며 응용 프로그램의 다른 부분이 결과를 반환 할 때까지 차단 될 수 있습니다. 약속은이 문제에 대한 더 나은 솔루션을 제공하며, 차단되지 않으며 코드에서 완전히 분리됩니다.
자바 스크립트의 비동기 프로그래밍을 살펴 보겠습니다. 우선, 비교적 인기있는 약속/사양을 살펴 보는 것이 좋습니다.
약속/사양
참고 : 이해의 용이성을 위해 설명은 약속/사양과 다를 수 있습니다.
CommonJS의 약속/사양은 API 인터페이스를 표준화하여 비동기로 논리 코드를 쉽게 이해할 수 있도록 비동기 프로그래밍을 단순화합니다.
우리는 약속/사양의 구현을 호출합니다. 약속 대상에는 세 가지 상태가 있습니다 : 성취되지 않고 성취되고 실패했습니다. 처음에는 성취되지 않은 상태로 만들어졌으며, 국가는 성취되지 않은에서 이행으로 변경되거나 실패 (실패/거부) 만 변경할 수 있습니다. 국가가 이행 (완료)되거나 실패 (실패/거부)되면 국가는 더 이상 변경할 수 없습니다.
약속/사양은 프로그램에서 지연 (또는 미래)의 개념을 설명하는 솔루션을 제공합니다. 주요 아이디어는 메소드를 실행 한 다음 응용 프로그램을 차단하고 다른 방법을 다시 전화하기 전에 결과가 돌아올 때까지 기다리는 것이 아니라 향후 청취를 만족시키기 위해 약속 대상을 반환하는 것입니다. 성취 된 상태와 실패한 상태는 모두들을 수 있습니다. Promise는 Promise Object를 반환하기 위해 다음 인터페이스를 구현하여 콜백을 등록합니다.
코드 사본은 다음과 같습니다.
그런 다음 인터페이스는 다른 약속 상태를 듣는 데 사용됩니다. FARFILLEDHANDLER는 충족 된 상태를 듣는 데 사용되며, 오류 핸들러는 실패한 상태를 듣는 데 사용되며 진행중인은 완료되지 않은 상태를 듣는 데 사용됩니다. 약속은 성취되지 않은 이벤트 청취를 강요하지 않습니다 (예 : 우리는 이전 버전의 jQuery (1.5, 1.6)가 연기 된 약속의 구현이지만, 만료되지 않은 상태의 청취를 앞뒤로 구현하지는 않습니다.
당시 인터페이스는 원래 약속 대상이 아닌 새로운 약속 객체를 반환한다고 일반적으로 믿어집니다. 이 새로운 새로운 약속 대상은 원래 약속 대상의 관점으로 이해 될 수 있습니다. 그것은 원래 약속 객체의 일련의 방법 만 포함합니다. 이 방법은 원래 약속 객체의 상태 만 관찰 할 수 있지만 이연 된 물체의 내부 상태를 변경할 수는 없습니다. 이것은 여러 발신자 간의 충돌을 피할 수 있으며, 이는 다른 발신자에게 영향을 미치지 않고 새로운 약속 대상의 상태를 변경할 수 있습니다.
또한 Promise는 Resolve (미완성에서 완료된 것으로 구현 상태) 및 거부 (미완성에서 거부 또는 실패로 구현 상태)에서 상태 전환을 구현하는 두 개의 인터페이스를 제공합니다.
이해하는 데 도움이되는 사진을 보내십시오.
약속을 통해 동기식 사고 방식으로 비동기 논리를 쓸 수 있습니다. 비동기 기능에서는 시도/캐치를 사용하여 예외를 포착 할 수 없으며 예외를 던질 수 없습니다. 약속을 통해 예외를 포착하는 것과 동등한 오류 핸들러를 직접 명시 적으로 정의 할 수 있습니다.
다음은 약속/사양에 따른 여러 클래스 라이브러리입니다.