머리말
내 이미지에서 비동기식은 Ajax와 함께 처음 나타났습니다. 나는 그 당시에 여전히 .net에서 작업하고 있었고 .NET은 실제로 비동기 제어를 발표했습니다 ...
마침내 비동기식이 아니라는 것을 알았지 만 ... 프론트 엔드 비동기식이 많이 사용됩니다. 그것이 비동기 프로그램이 아니라면, 당신은 당신이 쓴 nodejs가 기회 JavaScript에 의해 만들어 졌다고 말하는 것을 부끄럽게합니다.
비동기 프로그래밍 모델의 기능도 이어졌습니다. 비동기식에는 많은 장점이 있지만 디자인의 악몽입니다. 비동기식은 타이밍을 방해 할 수 있으므로 설계 어려움이 증가합니다.
그러나 비동기식은 성능 개선 및 사용자 경험에 혁명을 일으켰으므로 NodeJS의 비동기 기능은 매우 분명합니다. 오늘 우리는 그것을 간단하게 배울 것입니다
비동기 I/O
실제로 운영 체제 수준에는 차단 및 차단되지 않은 두 가지 I/O 방법 만 있습니다.
막힘 모델에서 응용 프로그램은 결과를 반환하기 전에 I/O가 완료 될 때까지 기다려야합니다. 그 특성은 백 미드 필더가 시스템이 모든 작업을 완료 할 때까지 기다리게된다는 것입니다. 이로 인해 차단 호출 직후에 돌아 오기보다는 CPU가 기다릴 수 있습니다.
나는 초보자 였을 때 책을 읽고 있었지만 여기서는 명확하게 설명되지 않았다고 느꼈습니다. 또한 비동기 모델은 실제로 매우 크며 느낌의 수준이 향상됩니다. 간단한 예를 들어 드리겠습니다
이제 두 개의 단일 페이지 응용 프로그램에 대한 단일 페이지 응용 프로그램보기가 있습니다. 검색 할 때 다양한 채널을 검색해야합니다. Shenzhen은 제 3 자에게 전화해야하며 제 3자는 특정 채널에서 데이터를 얻습니다.
물론 현재는 매우 느립니다. 데이터를로드하기 위해 A에서 B로 직접 자르면 문제가 없지만 이제 문제는 A에서 B로 전환 할 때 애니메이션 효과가 필요하다는 것입니다.
이를 위해서는 스위칭 프로세스 중에 BView 렌더링이 종료되어야하며, 적어도 데이터를 얻고 렌더링을 시작하기 위해 프로세스로 배송되지 않습니다. 따라서 비동기식은 사용하기 쉽지 않을 수 있습니다. 데이터를 비동기로 요청하더라도 페이지를로드하기 전에 데이터를 얻어야합니다.
이것은 여전히 차단 된 로딩입니다. 비즈니스에서이를 수행 할 방법이 없습니다.
완벽한 기술은 완벽하지 않으며, 막힘 원인 CPU가 낭비되기를 기다리고, 비 차단 방해 논리, 또한 부하가 완료되었는지 여부를 확인하기 위해 폴링이 필요할 수도 있습니다 (DOM이 생성되었는지 여부를 감지하기 위해 폴링을 사용하는 데 사용되었습니다).
Nodejs는 이벤트 루프 메커니즘을 채택합니다. 프로세스가 시작되면 노드는 데드 루프를 만듭니다. 루프 바디를 실행하는 각 프로세스는 진드기입니다. 각 진드기의 과정은 처리해야 할 이벤트가 있는지 확인하는 것입니다.
있으면 이벤트 관련 이벤트를 제거하고 실행 한 다음 다음 논리를 입력하십시오. 없으면 루프를 종료하십시오
각 진드기 과정에서 각 이벤트 루프에 하나 이상의 관찰자가 있습니다. 처리 할 이벤트가 있는지 판단하는 과정은 이들 관찰자에게 이벤트를 처리 해야하는지 물어 보는 것입니다.
HTML 이벤트 모델을 예로 들어 보겠습니다
HTML의 경우 실제로 각 DOM은 관찰자입니다. 페이지의 DOM은 웹 페이지의 변경 사항을 관찰합니다. addeventListener를 DOM에 제공 한 후 콜백 함수를 등록합니다. 우리가 등록하는 이벤트는 "컨테이너"객체에 배치됩니다. 현재 등록 일뿐입니다. 이러한 기능은 조건을 충족 한 후 (페이지가 변경 될 때) 트리거되며, 관련 이벤트는 컨테이너에서 실행되도록 꺼집니다.
이제 페이지의 한 점을 한 번 클릭 한 다음 컨테이너에서 클릭 이벤트 컬렉션을 꺼낼 것입니다. 관련 DOM을 찾은 다음 이러한 DOM의 콜백 기능을 트리거합니다.
이벤트는 사용자 클릭 또는 데이터 변경에서 발생할 수 있습니다. 노드에서 이벤트는 주로 네트워크 요청 및 파일 I/O에서 나옵니다. 이러한 이벤트에는 파일 관찰자 및 네트워크 관찰자와 같은 해당 관찰자가 있습니다.
이것은 또한 일반적인 생산/소비 모델, 비동기 I/O, 이벤트 제작을 제공하기위한 네트워크 요청, 이벤트가 다양한 관찰자에게 전달되고, 관찰자 등록 이벤트 및 이벤트 루프가 이벤트를 시작한 다음 이벤트를 실행할 책임이 있습니다.
추신 : 예제로 클릭하십시오. 각 DOM 관찰자는 먼저 이벤트를 등록하고 페이지 프로세스는 페이지를 지속적으로 모니터링하고 사용자는 페이지 제작 이벤트를 클릭 한 다음 등록 된 클릭 이벤트가 컨테이너에서 꺼내고 실행됩니다.
일반 기능 논리는 미국에 의해 제어됩니다.
코드 사본은 다음과 같습니다.
var foreach = 함수 (목록, 콜백) {
for (var i = 0, len = list.length; i <len; i ++) {
콜백 (목록 [i], i, list);
}
}
비동기식의 경우 콜백 함수는 더 이상 개발자가 제어하지 않습니다. JS 호출이 시작될 때마다 전환 제품 요청 객체가 생성됩니다.
코드 사본은 다음과 같습니다.
fs.open = 함수 (경로, 플래그, 모드, 콜백) {
Bingding.open (pathModule._Makelong (Path), StringTofLags (플래그), 모드, 콜백);
};
fs.open은 관련 데이터를 얻기 위해 경로와 매개 변수를 기반으로 파일을 엽니 다. C ++ 관련 인터페이스는 내부적으로 호출되며 프로세스 중에 중간 객체가 생성되고 모든 주가 포함됩니다 ...
추신 : 너무 오랫동안 본 후에는 기분이 좋지 않습니다.
결론
위의 것은 Nodejs의 비동기 I/O에 관한 것입니다. 개인적 요약, 누락이나 오류가 있으면 지적하십시오.