promise.then,process.nextTick, setTimeout 및 setImmediate 실행 순서
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 전체 코드가 실행됩니다. 실행 과정은
두 번째 단계.다른 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
총결산
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.