promise.then,process.nextTick, setTimeout 및 setImmediate 실행 순서

5300 단어
먼저 비교적 전형적인 예를 하나 들자.
setImmediate(function(){
    console.log(1);
},0);
setTimeout(function(){
    console.log(2);
},0);
new Promise(function(resolve){
    console.log(3);
    resolve();
    console.log(4);
}).then(function(){
    console.log(5);
});
console.log(6);
process.nextTick(function(){
    console.log(7);
});
console.log(8);

이 코드 출력의 정확한 순서는 무엇입니까?답은 다음과 같습니다.
3 4 6 8 7 5 2 1

출력 결과를 설명하기 전에 몇 가지 개념을 살펴보겠습니다.
macro-task: script(전체 코드), setTimeout, setInterval, setImmediate, I/O, UI rendering.micro-task: process.nextTick, Promise(네이티브), Object.observe,MutationObserver
첫걸음.script 전체 코드가 실행됩니다. 실행 과정은
  • setImmediate macro-task 만들기
  • setTimeout macro-task 만들기
  • micro-task Promise 생성then의 리셋을 실행하고script console를 실행합니다.log(3); resolve(); console.log(4); 이때 3과 4를 출력합니다. 리졸브가 호출되었지만 전체 코드가 실행되지 않아 Promise에 들어갈 수 없습니다.then 프로세스..
  • console.log(6) 출력 6
  • process.nextTick에서 micro-task 를 생성합니다
  • console.log(8) 출력 8 첫 번째 과정이 끝난 후 3468을 출력했습니다

  • 두 번째 단계.다른 micro-task의 우선순위가macro-task보다 높기 때문입니다.이때 micro-task에는 우선순위 프로세스에 따라 두 가지 작업이 있습니다.nextTick이 Promise보다 높습니다.그래서 먼저 7을 출력하고 5를 출력합니다.
    세 번째 단계, micro-task 작업 목록은 이미 실행되었고, 집에서 내려와macro-task를 실행합니다.setTimeout의 우선순위가 setIImmediate보다 높기 때문에 먼저 2를 출력하고 1을 출력합니다.
    전체 과정은 동기화 작업처럼 묘사되며, 실제로는 Event Loop 기반의 이벤트 순환

    micro-task와 macro-task의 실행 순서에 관해서는 아래의 예를 볼 수 있습니다.

    // nextTick 
    process.nextTick(function () {
        console.log('nextTick 1');
    });
    process.nextTick(function () { 
        console.log('nextTick 2');
    });
    //  setImmediate() 
    setImmediate(function () {
        console.log('setImmediate 1'); 
        //   
        process.nextTick(function () {
            console.log(' ');
        });
    });
    setImmediate(function () {
        console.log('setImmediate 2'); 
    });
    
    console.log(' ');

    이 코드를 실행합니다. 결과는 다음과 같습니다.
     
    nextTick 1
    nextTick 2
    setImmediate 1
    setImmediate 2
     

    새 Node에서 process.nextTick이 실행되면 setImmediate를 순환하고 setImmediate를 모두 실행한 후에 순환을 벗어납니다.그래서 두 개의 setImmediate가 실행된 후 대기열에는 첫 번째 setImmediate의 프로세스만 남았다.nextTick.마지막 출력 강세 삽입.

    우선 순위에 대한 또 다른 명확한 버전:


    관찰자 우선 순위
    매번 교대 훈련 검사에서 각 관찰자의 우선순위는 다음과 같다.
    idle 관찰자 > I/O 관찰자 > check 관찰자.
    idle 관찰자:process.nextTick
    I/O 관찰자: 네트워크, 파일, 데이터베이스 I/O 등 일반적인 I/O 리셋
    check 관찰자: setTimeout>setImmediate

    총결산

  • 동기화 코드 실행 순서 우선순위가 비동기 코드 실행 순서 우선순위보다 높다
  • new Promise(fn)의 fn은 동기화입니다
  • process.nextTick()>Promise.then()>setTimeout>setImmediate.
  • 좋은 웹페이지 즐겨찾기