异步

setTimeout(function(){
    console.log('立即执行setTimeout');
}, 0); 

var d = new Date().getTime(); 

while(true) { 
	var dd = new Date().getTime(); 
	if( ( dd - d ) > 1000 *10 ) { 
		console.info( '主任务循环10s后结束' ); 
		break; 
	}  
} 

console.info('主任务结束'); //主任务
  • 以上执行结果如下
VM446:10 主任务循环10s后结束
VM446:15 主任务结束
undefined
VM446:2 立即执行setTimeout
setTimeout(function(){
    console.log('立即执行setTimeout');
}, 0); 

var p = new Promise(function(resolve){
	resolve("promise回调产生");
});

p.then(function(value){
	console.info('异步Promise执行' + value);
});

var d = new Date().getTime(); 

while(true) { 
	var dd = new Date().getTime(); 
	if( ( dd - d ) > 1000 *10 ) { 
		console.info( '主任务循环10s后结束' ); 
		break; 
	}  
} 

console.info('主任务结束'); //主任务
  • 以上执行结果
VM440:18 主任务循环10后结束
VM440:23 主任务结束
VM440:10 异步Promise执行promise回调产生
undefined
VM440:2 立即执行setTimeout

同步任务

  • 主任务执行
  • 将主任务执行过程的异步任务加入任务队列
  • 主任务执行完成后,执行异步任务队列

异步任务

  • javascript 事件循环并发模型

  • setTimeout 和 promise都是异步任务

  • 异步任务都是通过任务队列进行管理和调度

  • 更多...

  • 任务队列又分为 MacroTask Queue{宏任务} 和 MicroTask Queue{微任务}

  • 宏任务: setTimeout, setInterval , setImmediate, requestAnimationFrame , NodeJS中的I/O...

  • 微任务: 独立回调任务 | 复合回调任务

  • 微任务之独立回调任务 [ Promise ] 其成功与失败的回调函数相互独立

  • 微任务之复合回调任务 [ Object.observe, MutationObserver 和NodeJs中的process.nextTick] 不同状态的回调函数在同一个函数体

执行过程

  • 依次执行同步代码直至执行完毕
  • 检查宏任务队列,若有触发的异步任务,则取第一个并调用器事件处理函数,然后跳转至第三步,若没有需要处理的异步任务,则直接第二步
  • 检查微任务,然后执行所有已经触发的异步任务,一次执行事件处理回调函数,直至执行完毕,然后调到第二步,若没有需要处理的异步任务,则直接返回第二步,依次执行后续步骤
  • 如此往复,若所有异步任务处理完毕,则结束;
  • 微任务优于宏任务
原文地址:https://www.cnblogs.com/pengsn/p/13150498.html