동기 및 비동기 이벤트 루프 이벤트 루프

JS 단일 스레드 모델

자바 스크립트는 단일 스레드이며, 언어를 비 차단, 거기에 하나의 메인 스레드이지만, 단 하나 개의 작업을 수행 할 수 있습니다.

JS는 단순화하기 위해 단일 스레드 사용하십시오

스택, 힙 및 메시지 큐를 JS

스택

그것은 호출 함수 레코드에 저장됩니다 - 전화 프레임

더미

그것은 객체에 저장된다

메시지 큐

  • 메시지 큐; 상기 보류
  • 각 메시지는 메시지를 처리하는 콜백 함수와 연관된다.

이벤트 루프

이벤트 루프 이벤트 루프 무엇입니까

이벤트 루프는 루프 검사 메커니즘입니다

  • 메인 스레드가 작업을 실행하는 경우 (비동기 작업이라고 메시지 큐에서 JS 작업) 조건을 충족하기 위해 비동기 메시지 큐 작업이 있는지 확인하는 것입니다.
  • 그렇다면, 비동기 태스크는 메인 스레드 동기화 태스크로 전송하고 관련된 콜백 함수를 수행 될
  • 작업이 모두를 통해 태스크 큐를 수행하는 경우 연속주기, 프로그램이 종료됩니다.

주요 스레드

동기 및 비동기 작업 작업

동기화 작업

주 스레드의 작업 실행 큐를 중단하지 않습니다

비동기 작업

작업은 매크로 및 마이크로 작업으로 분할된다

매크로 작업

포함 :
전체 코드 포함script、setTimeout、setInterval、setImmediate、I/O、UI rendering

마이크로 작업

포함 :
promise.then, process.nextTick(node中)

마이크로 작업 전에 매크로 작업 실행 순서

프로세스 이벤트 루프

메인 스레드 동기화 태스크 비운 후에 태스크의 실행이 [매크로 작업]에 대한 전체 코드와 첫 번째 구현은 마이크로 작업 목록을 확인할 때, 하나의 실행에 의해 메인 스레드 중 하나에 첨가 비어 있지 않은 경우, 마이크로 태스크리스트 후에 비워 매크로 태스크의 실행, 마이크로 작업 목록의 완료 후에 매크로 태스크 실행이 비어 있지 않으면, 작업이 마이크로 비어까지 마이크로 태스크의 실행 한 후, 다음 매크로 작업을 수행이 끝나는 이벤트 루프 비워 모든 태스크리스트로 순환되었다.

예 :

console.log(1); //1.同步任务#1
setTimeout(function(){  //1.宏任务加入marcotask $1
    console.log(2);
    new Promise(function(resolve){ 
        console.log(3);
        setTimeout(function(){  //$3
            console.log(4);
        });
        resolve();
    }).then(function(){ //&2
        console.log(5);
    });
});
new Promise(function(resolve){  //1.promise 是同步任务!!!#2
        console.log(6);
        setTimeout(function(){  //1.加入宏任务队列 $2
            console.log(7);
        });
        resolve();
    }).then(function(){ //1.微任务加入microtask &1
        console.log(8);
    });
console.log(9); //1.同步任务#3

169,823,574의 결과

  • 첫째 # 1 동기화 작업이 발생 수행 setTimeout받는 추가 매크로 작업 $ 1 macrotask을 충족 큐, promise동기화 작업 # 2, 직접 실행을, promise실행은 실행 setTimeout매크로 작업 $ 2, 가입 macrotask만난 큐, then()마이크로 태스크 큐, 다음 동기화 작업 # 3 가입을 이벤트 루프의 일단,
    케이스 : 출력 결과 [169]
    . macrotask : $ 2 $ 1
    Microtask 1 :.
  • 1 마이크로 태스크, 태스크 동기화 출력 [8], 마이크로 비어있는 큐 수행 macrotask 수행
  • 매크로 작업 $ 1의 실행을 충족 동기화 작업 출력 [2], 수행 promise의 동기화 작업을 수행하기 위해, 출력 [3], 발생 setTimeout매크로 작업 $ 3, 참여 macrotask, 대회 then()& 2, 추가 microtask, $ 1 매크로 작업이 완료되어 microtask있으므로, 비어 있지 다음으로 마이크로 작업을 수행한다.
  • 마이크로 태스크 실행 태스크리스트 & 2, 출력은 [5], 큐의 종료 후에 마이크로 비어 매크로 작업 실행
  • $ 2 매크로 작업 실행, 출력 [7], 실행 종료
  • $ 3 매크로 작업 실행, 출력 [4], 실행 종료
  • 이 때, 모든 큐는 이벤트 루프의 끝을 비 웁니다.

요약 : 제 매크로 작업, 실행중인 모든 마이크로 작업 등을 수행하는 단계;

추천

출처www.cnblogs.com/qiuqiubai/p/12545394.html