async function async1(){
console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2(){
console.log('async2')
}
console.log('script start')
setTimeout(function(){
console.log('setTimeout')
},0)
async1();
new Promise(function(resolve){
console.log('promise1')
resolve();
}).then(function(){
console.log('promise2')
})
console.log('script end')
Chrome 66 및 node v10에서 이 문제의 정확한 출력은 다음과 같습니다.
script start
async1 start
async2
promise1
script end
promise2
async1 end
setTimeout
지식
매크로 작업은 일반적으로 전체 코드 script, setTimeout, setInterval, setImmediate, MessageChannel을 포함한다
마이크로 퀘스트는 일반적으로 Promise, process를 포함한다.nextTick
실행 순서는 우선 매크로 작업의 대기열(이 대기열은taskqueue라고도 부른다)에서 첫 번째 작업을 꺼내고 실행이 끝난 후에 마이크로 작업 대기열의 모든 작업 순서를 꺼내서 실행한다.그 다음에 매크로 퀘스트를 하나 더 가져와서 두 큐의 퀘스트가 모두 끝날 때까지 반복합니다
우선 순위 1.매크로 작업의 우선 순위: 주 코드 블록 > setImmediate > MessageChannel > setTimeout/setInterval 2.마이크로 작업의 우선순위:process.nextTick > Promise > MutationObserver
Promise 1. Promise가 정의되면 즉시 실행됩니다. 2. Promise의 reject와resolve는 비동기적으로 실행되는 리셋입니다.따라서resolve () 는 리셋 대기열에 저장됩니다